搭建好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](https://i-blog.csdnimg.cn/blog_migrate/9fe8058c8902eafc784ff140339cdcfa.jpeg)
同时web.xml文件中加载spring的位置也需要调整
![47eb6f04058acb66ef9dfa094d97ea17.png](https://i-blog.csdnimg.cn/blog_migrate/c729f3f001f195ff08068c253e8742a4.jpeg)
applicationContext-shiro.xml中的内容:
<?xml version="1.0" encoding="UTF-8"?> /login.do=authc /**=anon
创建自定义的realm
![417144d343a197f32ba657b65ba073a4.png](https://i-blog.csdnimg.cn/blog_migrate/ceaf3207a2dcba6cfd09882d76793342.jpeg)
完成service和mapper
![9999cc34bbb5fe819f6ff97098374008.png](https://i-blog.csdnimg.cn/blog_migrate/a227a6f9fb1af50f94a0b1a1a9b85e50.jpeg)
完成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](https://i-blog.csdnimg.cn/blog_migrate/504e18abd04576ab05013e740fed25ff.jpeg)
测试
账号错误
![7f365bb422bb0eba2c9a95ced15676db.png](https://i-blog.csdnimg.cn/blog_migrate/043a67b1ee2416f824048172c99d7462.jpeg)
![80d79a5748720460364530abae94f784.png](https://i-blog.csdnimg.cn/blog_migrate/04319a2869ca7e5fcc4816d90b333d5b.jpeg)
![567b4d34821c28105accc8e901e8fca3.png](https://i-blog.csdnimg.cn/blog_migrate/f8e8aababe280c04fe7f286bebf62fcd.jpeg)
密码错误
![f96f19a60ef5d55007ca014e882abd32.png](https://i-blog.csdnimg.cn/blog_migrate/270a6a9e3ca63430a5a099a6c1dcd859.jpeg)
![d1bc4a6ecea4ba84fde251f54ec4528f.png](https://i-blog.csdnimg.cn/blog_migrate/98e0581ed1adb63966a3a5e90ceed298.jpeg)
![db7bb41a4f33352acf257c57885d923e.png](https://i-blog.csdnimg.cn/blog_migrate/2195041fb4d29ade06605d5f8819687e.jpeg)
账号密码正确的情况
![7925a6953d67f36bdafb5a5b302ed230.png](https://i-blog.csdnimg.cn/blog_migrate/d952b0aefcea74169b4ba41d5b5de423.jpeg)
![6ea9f973557dc0887aad4b48491fe5c7.png](https://i-blog.csdnimg.cn/blog_migrate/1905513ba323d9ded15dee9487d6cc16.jpeg)
执行的原理过程
![6dff8e59f497d550a00f7e39d9080f22.png](https://i-blog.csdnimg.cn/blog_migrate/02a9d68497de2109123f80d00f486958.jpeg)
文字描述
1.客户端提交的请求到来的时候,首先过滤器会判断该请求是否可以匿名访问,如果不可以,则判断当前是否是登录状态,如果不是就会跳转到如下地址中:
![00ed658dffd184f2ff8eb32d1885739f.png](https://i-blog.csdnimg.cn/blog_migrate/52c04cff4f0c1664fea5f6422effb15c.jpeg)
2.如果用户请求的是可以匿名访问的地址,比如login.jsp那么服务器就会直接响应该请求
![c852f96abf1725257c7cb86730ae6af1.png](https://i-blog.csdnimg.cn/blog_migrate/2c7f67ec15f620069d08aa1f36348539.jpeg)
3.如果请求的地址是 login.do那么该请求会被过滤器拦截,并进行登录认证。因为该请求我们特别配置了
![3f503c4abf9027a80350610e9f3cf5e3.png](https://i-blog.csdnimg.cn/blog_migrate/1410d37b96d0b4f3ecca91d9b5f3684c.jpeg)
FormAuthenticationFilter该过滤器会获取表单提交的内容,
![83902b19be99f467880c115bf5c9e4c8.png](https://i-blog.csdnimg.cn/blog_migrate/c4c71a9b8b1a056c1f65223519989f0e.jpeg)
4.认证出错,需要表单提交的账号和密码为username和password。
之后会被我们自定义的Realm认证,如果认证出错,会将错误信息保存在request作用域中key为shiroLoginFailure,
![3f1737cf345cdc5fd29d78b4ceeaf04d.png](https://i-blog.csdnimg.cn/blog_migrate/600e23033ed2ea7e38f0876c02bd2678.jpeg)
并跳转到controller的login.do方法中。
![4636fa0faf5abe82eaf8277681c4cf2e.png](https://i-blog.csdnimg.cn/blog_migrate/f2480249c2191516300b267b6f62d9b4.jpeg)
5.认证成功,会跳转到我们指定的成功页面,
![a53270c58061a2b5f414353a603dac9b.png](https://i-blog.csdnimg.cn/blog_migrate/741cfc67f64b999d6fef22475f7fd07f.jpeg)
![171984c5028a42764d182b1a0625cd2a.png](https://i-blog.csdnimg.cn/blog_migrate/05c5ebb9cbd5e526deea605c4c4b3594.jpeg)
内置过滤器介绍
内置过滤器对应关系
![0372ef084dbdd9275bffd96bf1f13b51.png](https://i-blog.csdnimg.cn/blog_migrate/21d81878d93dbf242db731d50792eb6a.jpeg)
内置过滤器说明
![fb222ccf32ff5209dd33898bd6e270ba.png](https://i-blog.csdnimg.cn/blog_migrate/ba59cd398930a0b4723a275f2e2efe0c.jpeg)
本