解决shiro不进FormAuthenticationFilter的问题

首先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);

好吧,就到这里了,有问题再问我

展开阅读全文

没有更多推荐了,返回首页