Shiro10-Shiro 整合开发-登录和退出

登录

原理

使用** FormAuthenticationFilter**过滤器实现, 原理如下:
用户没有认证时, 就会请求 loginurl进行认证, 用户身份和用户密码提交数据到loginurl地址.

数据提交到 loginurl 地址后, 由** FormAuthenticationFilter**进行拦截, 并取出 request 中的username 和 password.

然后** FormAuthenticationFilter** 会调用 realm, 在进行调用时会传入一个 token, 也就是会传入username 和 password.

最后 realm 认真时根据 username 查询用户信息.例如我们之前查询了用户菜单和 url.

如果查询不到, realm 返回 null, ** FormAuthenticationFilter**向 request 域填充一个参数, 这个参数记录了异常信息.

实现

    //登陆提交地址,和applicationContext-shiro.xml中配置的loginurl一致
    @RequestMapping("login")
    public String login(HttpServletRequest request)throws Exception{
        
        //如果登陆失败从request中获取认证异常信息,shiroLoginFailure就是shiro异常类的全限定名
        String exceptionClassName = (String) request.getAttribute("shiroLoginFailure");
        //根据shiro返回的异常类路径判断,抛出指定异常信息
        if(exceptionClassName!=null){
            if (UnknownAccountException.class.getName().equals(exceptionClassName)) {
                //最终会抛给异常处理器
                throw new CustomException("账号不存在");
            } else if (IncorrectCredentialsException.class.getName().equals(
                    exceptionClassName)) {
                throw new CustomException("用户名/密码错误");
            } else if("randomCodeError".equals(exceptionClassName)){
                throw new CustomException("验证码错误 ");
            }else {
                throw new Exception();//最终在异常处理器生成未知错误
            }
        }
        //此方法不处理登陆成功(认证成功),shiro认证成功会自动跳转到上一个请求路径
        //登陆失败还到login页面
        return "login";
    }

这里一定要注意我们写的这个 login() 方法, 只是负责处理认证失败的结果, 如果用户认证成功那么就会跳转到上一个请求路径.

什么是上一个请求路径呢?
答: 如果你要访问 xxxx.jsp 但是 shiro 发现你还没有登录, 就会进行拦截, 并跳转到登录界面例如login.jsp, 当认证成功后会跳转到xxxx.jsp

认证拦截过滤器配置


/images/** = anon
/js/** = anon
/styles/** = anon

/** = authc

退出

不用我们实现退出, 只要访问一个退出 url, 由LogoutFilter拦截住, 清除 session.


/logout.action = logout

从 Shiro 的 session 中获取认证信息

//因为我们用过 Shiro 用户认证后是存放在 Shiro 的 session 中.
Subject subject = SecurityUtils.getSubject();
//取出身份信息
subject.getPrincipal();
Shiro10-Shiro 整合开发-登录和退出_第1张图片

你可能感兴趣的:(Shiro10-Shiro 整合开发-登录和退出)