shiro认证的一些流程

spring shiro的过滤器配置


    
    
    
    



    
    
    
        
            
            
            
            
            
        
    
    
        
            /login=authc
            /logout=logout
            /authenticated=authc
            /**=user,sysUser
        
    

登陆的action
@RequestMapping(value = "/login"    )
public String showLoginForm(HttpServletRequest req, Model model) {
    String exceptionClassName = (String)req.getAttribute("shiroLoginFailure");
    String error = null;
    if(UnknownAccountException.class.getName().equals(exceptionClassName)) {
        error = "用户名/密码错误";
    } else if(IncorrectCredentialsException.class.getName().equals(exceptionClassName)) {
        error = "用户名/密码错误";
    } else if(exceptionClassName != null) {
        error = "其他错误:" + exceptionClassName;
    }
    model.addAttribute("error", error);
    return "login";
}
登陆表单页面


    登录
    



${error}
用户名:
密码:
自动登录:
两个情况说明:
  • 在浏览器中输入地址: localhost:8080/ 的流程
    配置文件中/**=user,sysUser,所以先走 UserFilter 这个过滤器
    此时用户未登陆,在UserFilter 过滤器中,会重定向到 /login,进入登陆页面,并且记住此时的请求地址 "/"
     在页面中输入用户名密码,此时action=""是这样的,当点击提交按钮时,表单会提交到 当前的地址 "/login",post方法而且带着用户名和密码
    /login=authc 因为这个配置,会经过FormAuthenticationFilter这个过滤器,该类会判断此请求是否为登陆请求,如果是,则走登陆流程(subject.login(xxx)),登陆成功后, 会重现跳转到 上次保存的请求地址 ”/"
  • 在浏览器中输入地址:localhost:8080/login
    /login=authc 因为这个配置,会经过FormAuthenticationFilter这个过滤器,
    该类会判断此请求是否为登陆请求,如果是,则走登陆流程(subject.login(xxx)),
    登陆成功后, 因为没有其他的求情,成功后会直接跳转到successUrl;如果没有配置,默认是”/"

看一下FormAuthenticationFilter的继承关系

shiro认证的一些流程_第1张图片
522024-20170106175648972-643940969.png
重要的方法
 public boolean onPreHandle(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {
    return isAccessAllowed(request, response, mappedValue) || onAccessDenied(request, response, mappedValue);
}

先判断是否已经授权,如果没有再判断是否是登陆请求

shiro的认证流程
shiro认证的一些流程_第2张图片
522024-20170106172237019-1331775620.png

你可能感兴趣的:(shiro认证的一些流程)