李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
SpringBoot整合Shiro
Leefs
2019-12-21 AM
2383℃
0条
# SpringBoot整合Shiro ### 前言 在之前篇章中讲述了Shiro的一些基本概念,本篇将讲述SpringBoot对Shiro的整合 ### 方法一 将SSM整合Shiro的配置用SpringBoot进行整合。 #### 1. 创建项目 创建SpringBoot项目,只需要添加Web依赖: ![SpringBoot-ShiroDemo01.png][1] #### 2. 项目创建完成后,加入Shiro相关的依赖,pom.xml 文件中添加依赖如下: ```xml
org.apache.shiro
shiro-web
1.4.0
org.apache.shiro
shiro-spring
1.4.0
``` #### 3. 创建Realm 在我们自定义Realm中实现了AuthorizingRealm接口,将其方法进行重写,将各种权限对用户进行授权,同时对用户身份进行验证。 ```java public class MyRealm extends AuthorizingRealm { @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { return null; } @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { //获取登录用户名 String username = (String) token.getPrincipal(); if(!"Leefs".equals(username)){ throw new UnknownAccountException("账户不存在!");//未知账号异常 } return new SimpleAuthenticationInfo(username,"123456",getName()); } } ``` > 说明 **SimpleAuthenticationInfo参数说明** SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(userInfo,userInfo.getPassword(), salt, getName()); > userInfo:传入用户对象对应的用户名 > > userInfo.getPassword():从数据库获取的密码 > > salt:盐值 > > getName():当前的realm名 **常见异常类说明** **AuthenticationException:**异常是Shiro在登录认证过程中,认证失败抛出的异常。 AuthenticationException包含的子类: 1. 1.CredentitalsException 凭证异常 + IncorrentCredentialsException 不正确的凭 + ExpiredCredentialsException 凭证过期 2. 2.AccountException 账号异常 + ConcurrentAccessException 并发访问异常(多个用户同时登录时抛出) + UnknownAccountException 未知的账号 + ExcessiveAttemptsException 认证次数超过限制 + DisabledAccountException 禁用的账号 + LockedAccountException 账号被锁定 3. 3.UnsupportedTokenException 使用了不支持的Token #### 4. 配置Shiro ```java @Configuration public class ShiroConfig { @Bean MyRealm myRealm(){ return new MyRealm(); } @Bean DefaultWebSecurityManager securityManager(){ DefaultWebSecurityManager manager = new DefaultWebSecurityManager(); manager.setRealm(myRealm()); return manager; } @Bean ShiroFilterFactoryBean shiroFilterFactoryBean(){ ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean(); bean.setSecurityManager(securityManager()); bean.setLoginUrl("/login"); bean.setSuccessUrl("/index"); bean.setUnauthorizedUrl("/unauthorizedurl"); Map
map = new LinkedHashMap<>(); map.put("/doLogin","anon"); map.put("/**","authc"); bean.setFilterChainDefinitionMap(map); return bean; } } ``` **在这里进行 Shiro 的配置主要配置 3 个 Bean :** > 1. 1.首先需要提供一个Realm的实例 > 2. 2.需要配置一个 SecurityManager,在 SecurityManager 中配置 Realm。 > 3. 3.配置一个 ShiroFilterFactoryBean ,在 ShiroFilterFactoryBean 中指定路径拦截规则等。 > 4. 4.配置登录和测试接口。 **ShiroFilterFactoryBean的配置说明** > + setSecurityManager 表示指定 SecurityManager > + setLoginUrl 表示指定登录页面 > + setSuccessUrl 表示指定登录成功页面 > + 接下来的 Map 中配置了路径拦截规则,注意,要有序 #### 5. 配置登录Controller ```java @RestController public class LoginController { @PostMapping("/doLogin") public void doLogin(String username,String password){ Subject subject = SecurityUtils.getSubject(); try { subject.login(new UsernamePasswordToken(username, password)); System.out.println("登录成功!"); } catch (AuthenticationException e) { e.printStackTrace(); System.out.println("登录失败!"); } } @GetMapping("/hello") public String hello() { return "hello"; } @GetMapping("/login") public String login() { return "please login!"; } } ``` #### 6. 进行测试 1.访问`/hello`接口,由于未登录,所以会自动跳转到 `/login` 接口: ![SpringBoot-ShiroDemo02.png][2] 2.调用 /doLogin 接口完成登录: ![SpringBoot-ShiroDemo03.png][3] 3.再次访问 `/hello` 接口,就可以成功访问了: ![SpringBoot-ShiroDemo04.png][4] ### 方法二 使用官方提供的Starter进行Shiro的搭建 #### 1. 创建工程,和上面的一样 #### 2. 添加依赖 创建成功后,添加 `shiro-spring-boot-web-starter` ,这个依赖可以代替之前的 `shiro-web` 和 `shiro-spring` 两个依赖 #### 3. 创建Realm #### 4. 配置登录Controller 3,4都和前面一样 #### 5. 配置Shiro的基本信息 接下来在 application.properties 中配置 Shiro 的基本信息: ```java shiro.sessionManager.sessionIdCookieEnabled=true shiro.sessionManager.sessionIdUrlRewritingEnabled=true shiro.unauthorizedUrl=/unauthorizedurl shiro.web.enabled=true shiro.successUrl=/index shiro.loginUrl=/login ``` 配置说明: 1. 1.第一行表示是否允许将sessionId 放到 cookie 中 2. 2.第二行表示是否允许将 sessionId 放到 Url 地址拦中 3. 3.第三行表示访问未获授权的页面时,默认的跳转路径 4. 4.第四行表示开启 shiro 5. 5.第五行表示登录成功的跳转页面 6. 6.第六行表示登录页面 #### 6. 配置 ShiroConfig ```java @Configuration public class ShiroConfig { @Bean MyRealm myRealm() { return new MyRealm(); } @Bean DefaultWebSecurityManager securityManager() { DefaultWebSecurityManager manager = new DefaultWebSecurityManager(); manager.setRealm(myRealm()); return manager; } @Bean ShiroFilterChainDefinition shiroFilterChainDefinition() { DefaultShiroFilterChainDefinition definition = new DefaultShiroFilterChainDefinition(); definition.addPathDefinition("/doLogin", "anon"); definition.addPathDefinition("/**", "authc"); return definition; } } ``` 这里的配置和前面的比较像,但是不再需要 ShiroFilterFactoryBean 实例了,替代它的是 ShiroFilterChainDefinition ,在这里定义 Shiro 的路径匹配规则即可。 这里定义完之后,接下来的登录接口定义以及测试方法都和前面的一致,大家可以参考上文进行测试。 *附:[参考原文链接](https://blog.csdn.net/u012702547/article/details/91413078)* [1]: https://lilinchao.com/usr/uploads/2019/12/3725528551.png [2]: https://lilinchao.com/usr/uploads/2019/12/1944719272.png [3]: https://lilinchao.com/usr/uploads/2019/12/1406839295.png [4]: https://lilinchao.com/usr/uploads/2019/12/1855141237.png
标签:
Java
,
SpringBoot
,
Shiro
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/309.html
上一篇
字符串--正则表达式简介
下一篇
字符串--创建正则表达式
评论已关闭
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
NLP
4
标签云
数据结构和算法
JavaScript
Http
FastDFS
MyBatis
Spring
Java工具类
栈
Elasticsearch
Git
VUE
机器学习
链表
序列化和反序列化
Spark
pytorch
Azkaban
Hive
持有对象
稀疏数组
LeetCode刷题
Elastisearch
GET和POST
Jquery
Golang基础
工具
Golang
nginx
Flume
递归
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭