李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
SpringBoot整合Shiro
Leefs
2019-12-21 AM
1778℃
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
标签云
Eclipse
Nacos
CentOS
NIO
Ubuntu
正则表达式
Golang基础
二叉树
Map
序列化和反序列化
Azkaban
国产数据库改造
Typora
Http
JavaWEB项目搭建
Java
SpringCloud
JavaWeb
散列
Spark Streaming
前端
数学
哈希表
Golang
Beego
SQL练习题
设计模式
Linux
LeetCode刷题
稀疏数组
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞