文档章节

shiro不明白

momo1987
 momo1987
发布于 2017/09/08 18:34
字数 597
阅读 23
收藏 2

默认拦截器FormAuthenticationFilter 只拦截post请求。

不需要配置authc = org.apache.shiro.web.filter.authc.FormAuthenticationFilter,因为默认的就是FormAuthenticationFilter

我们在登录的时候,如果用户名为username,密码为password,那么我们可以不用自己写登录的代码,FormAuthenticationFilter这个过滤器会自动帮我们进行登陆验证。在测试shiro框架的时候,也都没问题。

但是后来在实际项目开发中,突然发现FormAuthenticationFilter不起作用了,后来才发现原因:在测试的时候,filterChainDefinitions中配置了/** = authc ,表示所有访问地址都有经过FormAuthenticationFilter过滤,但是在实际项目的时候,并没有这么配置,因此失效了。

解决方案:filterChainDefinitions下配置加上/login = authc,此处的/login就是你登录的时候表单提交的路径。

提示:authc表示使用FormAuthenticationFilter来过滤

1. 判断当前URL是否为登录地址:

shiroFilter的loginUrl值。

boolean org.apache.shiro.web.filter.AccessControlFilter.isLoginRequest(ServletRequest request, ServletResponse response);

 

2. 如果当前请求URL为登录地址时,判断是否为form提交。

boolean org.apache.shiro.web.filter.authc.FormAuthenticationFilter.isLoginSubmission(ServletRequestrequest, ServletResponse response);

在此两点可以总结出登录表单及登录界面URL的规则,即:

get loginUrl:进入登录界面

post loginUrl:提交登录表单

username:表单用户名

password:表单密码

 

当登陆报错了才会进来login方法中来。若身份验证成功的话,会直接跳转到之前的访问地址或是successfulUrl去。因为在FormAuthenticationFilter内部都已经做完认证了。我们只需要在login方法中写上(判断异常类型)验证失败的逻辑就好,

@RequestMapping(value = "login",method = RequestMethod.POST)
public string loginSubmit(Param param) {
    String errorClassName = (String) ServletHelper.getRequestAttribute(FormAuthenticationFilter.DEFAULT_ERROR_KEY_ATTRIBUTE_NAME);
    if(UnknownAccountException.class.getName().equals(errorClassName)) {
        ServletHelper.setRequestAttribute("error", "用户名/密码错误");
    } else if(IncorrectCredentialsException.class.getName().equals(errorClassName)) {
        ServletHelper.setRequestAttribute("error", "用户名/密码错误");
    } else if(errorClassName != null) {
        ServletHelper.setRequestAttribute("error", "未知错误:" + errorClassName);
    }
    // 登录失败后,跳回到login画面,让用户再次登录
    return "admin/login";
}

//DisabledAccountException (禁用的帐号)
//LockedAccountException (锁定的帐号)
//UnknownAccountException(错误的帐号)
//ExcessiveAttemptsException(登录失败次数过多)
//IncorrectCredentialsException (错误的凭证)
//ExpiredCredentialsException (过期的凭证)
……

 

shiroFilter的successUrl值

<!--successUrl配置只是做为一种附加配置,只有session中没有用户请求地址时才会使用successUrl。-->
<!--系统默认的是认证成功后跳转到上一次请求的路径,如果是首次请求,-->
<!--那shiro就会跳转到默认虚拟路径“/”,也就是跳转到index.jsp。-->

© 著作权归作者所有

共有 人打赏支持
momo1987
粉丝 1
博文 52
码字总数 12135
作品 0
深圳
私信 提问
shiro报错 There is no session with id [xxx]

shiro报错There is no session with id [xxx] 七月 06, 2015 3:06:03 下午 org.apache.catalina.core.StandardWrapperValve invoke严重: Servlet.service() for servlet [spring_mvc] in con......

Misia寒寒
2015/07/06
16.2K
7
jfinal集成shiro的问题

有过jfinal集成shiro的大神们,求指教下jfinal集成shiro,网上看了那些shiro.ini,但不怎么明白这配置文件是怎么去配置的,求大神们指教下,谢谢

Po-Chan
2015/05/27
139
0
web项目中使用shiro权限管理,session过期

Java web项目中权限控制使用的是shiro,不明白一点,当shiro配置的session过期时候,页面中的ajax请求要怎么处理,现在的是session过期后,ajax返回的数据是login页面,所以出现undefined,这...

嘣猪嗤痴
2016/05/23
6.9K
13
jfinal shiro 问题

@玛雅牛 你好,想跟你请教个问题: 我看到你jfinalshiro2.0 plug ,尝试着做例子现在遇到了一些不太明白地方向您请教。ShiroKit中设置了loginUrl等属性,这些属性如何传递给shiro的auth认证对...

丢不丢你
2015/08/11
227
3
shiro:每次页面request,SecurityUtils.getSubject() 返回不同的值

@eyelee 你好,想跟你请教个问题: jfinal整合shiro,shiro权限的使用中,每次页面request,SecurityUtils.getSubject() 得到的subject 不一样, SecurityUtils.java public static Subject...

andylive
2013/07/30
32.7K
10

没有更多内容

加载失败,请刷新页面

加载更多

聊聊我怎么系统学习Linux技能并快速提高的

聊聊我怎么系统学习Linux技能并快速提高的 随着电子信息科技时代的发展,学会使用计算机在我们的生活中成为了必不可少的一项技能。而作为计算机中的三大操作系统之一的Linux更是饱受计算机爱...

linuxCool
11分钟前
1
0
Android/Java 获取一个byte[]的真实编码,用于解决乱码问题

来源地址:https://blog.csdn.net/qq_31384551/article/details/81627840 一个byte数组,byte[] buf,是由一个字符串转换来的,如何判断字符串使用的是什么编码? Mozilla的一个组件提供了相应...

她叫我小渝
20分钟前
0
0
使用spring-retry实现重试机制

我们经常会遇到一些场景,需要重试当前的操作,比如:文件上传失败,重新上传;微信accesstoken获取失败,重新获取等等的场景问题。那么今天就说一种可以实现此种机制的工具包:spring-retr...

哥本哈根的小哥
23分钟前
0
0
kubernetes notes

Error from server (ServerTimeout): error when creating "mysql.yaml": No API token found for service account "default", retry after the token is automatically created and added t......

kut
43分钟前
2
0
代理模式---静态代理

package com.atguigu.java; //接口的应用:代理模式---静态代理。 public class ProxyTest { public static void main(String[] args) { NetWork work = new RealServer(); ProxyServer pro......

architect刘源源
59分钟前
2
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部