shiro密码正确也会匹配错误_shiro教程5(整合SSM项目-认证)

搭建好SSM项目

这个之前已经讲过,参考之前案例整合教程

项目中引入相关依赖

org.apache.shiroshiro-spring1.2.3org.apache.shiroshiro-ehcache1.2.3

web.xml文件中注册shiro过滤器

<?xml version="1.0" encoding="UTF-8"?>testcontextConfigLocationclasspath:applicationContext-*.xmlorg.springframework.web.context.ContextLoaderListenerspringmvcorg.springframework.web.servlet.DispatcherServletcontextConfigLocationclasspath:spring-mvc.xmlspringmvc/encodingorg.springframework.web.filter.CharacterEncodingFilterencodingUTF-8forceRequestEncodingtrueforceResponseEncodingtrueencoding/*shiroFilterorg.springframework.web.filter.DelegatingFilterProxytargetFilterLifecycletruetargetBeanNameshiroshiroFilter/*default*.jpgdefault*.jsdefault*.css

添加shiro的配置文件

注意shiro的配置可以添加在spring的配置文件中。但是为了便于管理我们再单独创建一个shiro的配置文件,里面的Schema还是spring的。

40022f89c01023df4d2cd10e604003d6.png

同时web.xml文件中加载spring的位置也需要调整

47eb6f04058acb66ef9dfa094d97ea17.png

applicationContext-shiro.xml中的内容:

<?xml version="1.0" encoding="UTF-8"?> /login.do=authc /**=anon 

创建自定义的realm

417144d343a197f32ba657b65ba073a4.png

完成service和mapper

9999cc34bbb5fe819f6ff97098374008.png

完成realm的认证功能

/** * 认证方法 *  * @param token * 就是我们在测试代码中 定义的UsernamePasswordToken对象 有我们保存的需要验证的账号密码信息 */@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {// 获取账号信息String principal = (String) token.getPrincipal();// 正常逻辑此处应该根据账号去数据库中查询,此处我们默认账号为 root 密码123456// 验证账号Users user = userService.login(principal);if (user == null) {return null;}// 获取密码String pwd = user.getPassword();// 获取盐值ByteSource bs = ByteSource.Util.bytes(user.getSalt());// 验证密码AuthenticationInfo info = new SimpleAuthenticationInfo(principal, pwd, bs, "myrealm");return info;}

完成controller

/** * 认证方法 *  * @param token * 就是我们在测试代码中 定义的UsernamePasswordToken对象 有我们保存的需要验证的账号密码信息 */@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {// 获取账号信息String principal = (String) token.getPrincipal();// 正常逻辑此处应该根据账号去数据库中查询,此处我们默认账号为 root 密码123456// 验证账号Users user = userService.login(principal);if (user == null) {return null;}// 获取密码String pwd = user.getPassword();// 获取盐值ByteSource bs = ByteSource.Util.bytes(user.getSalt());// 验证密码AuthenticationInfo info = new SimpleAuthenticationInfo(principal, pwd, bs, "myrealm");return info;}

准备数据

login.jsp

账号:
密码:
b0033180bdad68f41f38f31b7f8ae839.png

测试

账号错误

7f365bb422bb0eba2c9a95ced15676db.png
80d79a5748720460364530abae94f784.png
567b4d34821c28105accc8e901e8fca3.png

密码错误

f96f19a60ef5d55007ca014e882abd32.png
d1bc4a6ecea4ba84fde251f54ec4528f.png
db7bb41a4f33352acf257c57885d923e.png

账号密码正确的情况

7925a6953d67f36bdafb5a5b302ed230.png
6ea9f973557dc0887aad4b48491fe5c7.png

执行的原理过程

6dff8e59f497d550a00f7e39d9080f22.png

文字描述

1.客户端提交的请求到来的时候,首先过滤器会判断该请求是否可以匿名访问,如果不可以,则判断当前是否是登录状态,如果不是就会跳转到如下地址中:

00ed658dffd184f2ff8eb32d1885739f.png

2.如果用户请求的是可以匿名访问的地址,比如login.jsp那么服务器就会直接响应该请求

c852f96abf1725257c7cb86730ae6af1.png

3.如果请求的地址是 login.do那么该请求会被过滤器拦截,并进行登录认证。因为该请求我们特别配置了

3f503c4abf9027a80350610e9f3cf5e3.png

FormAuthenticationFilter该过滤器会获取表单提交的内容,

83902b19be99f467880c115bf5c9e4c8.png

4.认证出错,需要表单提交的账号和密码为username和password。
之后会被我们自定义的Realm认证,如果认证出错,会将错误信息保存在request作用域中key为shiroLoginFailure,

3f1737cf345cdc5fd29d78b4ceeaf04d.png

并跳转到controller的login.do方法中。

4636fa0faf5abe82eaf8277681c4cf2e.png

5.认证成功,会跳转到我们指定的成功页面,

a53270c58061a2b5f414353a603dac9b.png
171984c5028a42764d182b1a0625cd2a.png

内置过滤器介绍

内置过滤器对应关系

0372ef084dbdd9275bffd96bf1f13b51.png

内置过滤器说明

fb222ccf32ff5209dd33898bd6e270ba.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值