文档章节

shiro不明白

momo1987
 momo1987
发布于 2017/09/08 18:34
字数 597
阅读 18
收藏 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

没有更多内容

加载失败,请刷新页面

加载更多

打开eclipse出现an error has occurred see the log file

解决方法: 1,打开eclipse安装目录下的eclipse.ini文件; 2,打开的文本文件最后添加一行 --add-modules=ALL-SYSTEM 3,保存重新打开Eclipse。...

任梁荣
昨天
4
0
搞定Northwind示例数据库,无论哪个版本的SQLServer都受用

Northwind数据库 从这里可以找到突破口: http://social.msdn.microsoft.com/Forums/zh-CN/Vsexpressvb/thread/8490a1c6-9018-40c9-aafb-df9f79d29cde 下面是MSDN: http://msdn2.microsoft......

QQZZFT
昨天
1
0
mysql主从同步,安装配置操作

准备 两台mysql服务,我这里准备了如下: 主库:192.168.176.128 从库:192.168.176.131 如何在Linux上安装mysql服务,请看https://blog.csdn.net/qq_18860653/article/details/80250499 操作...

小致dad
昨天
4
0
一个手机装天下,走遍中国都不怕!

导读 “1200元(人民币,下同),微信支付,可以,你扫我。”来自西非马里共和国的展商Albert拿着手机,和一位买走他手鼓的中国游客用简单的汉语交流着。 近日,“第十四届中俄蒙经贸洽谈暨商品...

问题终结者
昨天
3
0
Redis的“死键”问题

大规模的数据库存储系统中,数据的生命周期管理是很有必要的;从业务角度发现过期数据,数据归档和数据碎片整理等。以MySQL为例,1个运行很久的TB级MySQL实例中,极有可能数百GB的数据,对业...

IT--小哥
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部