首先shiro实现登陆认证是不需要我们自己实现下面这一步的,因为过滤器FormAuthenticationFilter已经帮我们完成了。我看好多博客都是自己从request里面拿username,password然后封装UsernamePasswordToken,手动执行subject.login(token)。
Subject subject = SecurityUtils.getSubject();
//在认证提交前准备token(令牌)
UsernamePasswordToken token = new UsernamePasswordToken("zhangsan", "111111");
try {
//执行认证提交
subject.login(token);
使用FormAuthenticationFilter过虑器实现 ,原理如下(可以去看看该过滤器的源码):
将用户没有认证时,请求loginurl进行认证,用户身份和用户密码提交数据到loginurl
FormAuthenticationFilter拦截住取出request中的username和password(两个参数名称是可以配置的)
FormAuthenticationFilter调用realm传入一个token(username和password)。
该过滤器的使用也很简单:filterChainDefinitionMap.put("/login", "authc");这样就行了,但是这一步千万不要忘记加了,不然就不会被过滤器拦截了,这个拦截后就进入到我们自定义的realm里面进行认证了,所以我们只需要实现自定义的realm就可以了。我们登陆地址/login到FormAuthenticationFilter的映射链就是authc,大家有兴趣也可以看看user和authc的区别。
anon | org.apache.shiro.web.filter.authc.AnonymousFilter |
authc | org.apache.shiro.web.filter.authc.FormAuthenticationFilter |
authcBasic | org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter |
perms | org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter |
port | org.apache.shiro.web.filter.authz.PortFilter |
rest | org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter |
roles | org.apache.shiro.web.filter.authz.RolesAuthorizationFilter |
ssl | org.apache.shiro.web.filter.authz.SslFilter |
user | org.apache.shiro.web.filter.authc.UserFilter |
logout | org.apache.shiro.web.filter.authc.LogoutFilter |
filterChainDefinitionMap.put("/logout","logout"); //logut请求采用logout filter
//2.不拦截的请求
filterChainDefinitionMap.put("/css/**","anon");
filterChainDefinitionMap.put("/fonts/**","anon");
filterChainDefinitionMap.put("/img/**","anon");
filterChainDefinitionMap.put("/js/**","anon");
filterChainDefinitionMap.put("/bower_components/**","anon");
filterChainDefinitionMap.put("/login", "authc");//这一步很重要,不能用后面的/**,user来代替authc,因为这是两个不同的过滤器(不然设计两个干嘛呢),或者把后面的/**,user换成/**,authc,这一步也可以不要
filterChainDefinitionMap.put("/error","anon");
//4.登录过的不拦截
filterChainDefinitionMap.put("/**", "user");
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
这个是我的loginurl
shiroFilterFactoryBean.setSecurityManager(securityManager);
// 如果不设置默认会自动寻找Web工程根目录下的"/login.jsp"页面
shiroFilterFactoryBean.setLoginUrl(/login);
// 登录成功后要跳转的连接,卵用无,参考:https://blog.csdn.net/whm114336793/article/details/78021229
shiroFilterFactoryBean.setSuccessUrl(loginSuccessUrl);
shiroFilterFactoryBean.setUnauthorizedUrl(unauthorizedUrl);
好吧,就到这里了,有问题再问我