Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。
三个核心组件:
Subject
,
SecurityManager
和
Realms
.
Subject
:当前用户,Subject 可以是一个人,但也可以是第三方服务、守护进程帐户、时钟守护任务或者其它–当前和软件交互的任何事件。SecurityManager
:管理所有Subject,SecurityManager 是 Shiro 架构的核心,配合内部安全组件共同组成安全伞。Realms
:用于进行权限信息的验证,我们自己实现。Realm 本质上是一个特定的安全DAO
:它封装与数据源连接的细节,得到Shiro 所需的相关的数据。在配置 Shiro 的时候,你必须指定至少一个Realm 来实现认证(authentication)和/或授权(authorization)。
1. shiro认证
![](https://i-blog.csdnimg.cn/blog_migrate/c5d31e8450f8b24eebe5928c9eb256bf.png)
public class SimpleRealmTest0 {
SimpleAccountRealm simpleAccountRealm = new SimpleAccountRealm();
@Before
// 1、仅仅添加一个用户名密码
public void addUser() {
simpleAccountRealm.addAccount("Mark", "123456");
}
@Test
public void testAuthentication() {
// 1.构建SecurityManager环境
DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
defaultSecurityManager.setRealm(simpleAccountRealm);
// 2.主题提交认证请求
SecurityUtils.setSecurityManager(defaultSecurityManager);
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken("Mark", "123456");
subject.login(token);
System.out.println("是否登录:" + subject.isAuthenticated());
subject.logout();
System.out.println("是否登录:" + subject.isAuthenticated());
}
}
结果:
是否登录:true
14:31:56.098 [main] DEBUG o.a.shiro.mgt.DefaultSecurityManager - Logging out subject with primary principal Mark
14:31:56.099 [main] DEBUG o.a.s.s.mgt.AbstractSessionManager - Stopping session with id [92bc965b-1884-4b8f-96cd-8e48afaad6aa]
是否登录:false
参考:https://blog.csdn.net/ztchun/article/details/80330711
2. 授权
![](https://i-blog.csdnimg.cn/blog_migrate/959fb110609e612858a6b93f5aae2a9c.png)
public class SimpleRealmTest {
SimpleAccountRealm simpleAccountRealm = new SimpleAccountRealm();
@Before
public void addUser() {
simpleAccountRealm.addAccount("Mark", "123456", "admin");
}
@Test
public void testAuthentication() {
// 1.构建SecurityManager环境
DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
defaultSecurityManager.setRealm(simpleAccountRealm);
// 2.主题提交认证请求
SecurityUtils.setSecurityManager(defaultSecurityManager);
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken("Mark", "123456");
subject.login(token);
System.out.println("是否登录:" + subject.isAuthenticated());
subject.checkRoles("admin"); //授权
subject.logout();
System.out.println("是否登录:" + subject.isAuthenticated());
}
}
上述 subject.checkRoles("admin");
//授权 如果没有权限则直接抛出异常。
realm
上述认证和授权两个demo使用的是realm仅仅用于测试。下边介绍两种内置realm。
两种内置realm
- iniRealm
- jdbcRealm
1.iniRealm
从配置文件中读权限
public class IniRealmTest {
IniRealm iniRealm = new IniRealm("classpath:user.ini");
@Test
public void testIniRealm() {
// 1.构建SecurityManager环境
DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
defaultSecurityManager.setRealm(iniRealm);
// 2.主题提交认证请求
SecurityUtils.setSecurityManager(defaultSecurityManager);
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken("Mark", "123456");
subject.login(token);
System.out.println("是否登录:" + subject.isAuthenticated());
subject.checkRoles("admin"); //授权
subject.checkPermission("user:delete");
subject.logout();
System.out.println("是否登录:" + subject.isAuthenticated());
}
}
上述不同的地方:
IniRealm iniRealm = new IniRealm("classpath:user.ini");
defaultSecurityManager.setRealm(iniRealm);
其中配置文件放在Resource
文件夹下即可。
user.ini
[users]
\#提供了对用户/密码及其角色的配置,用户名=密码,角色1,角色2
Mark=123456,admin
[roles]
\#提供了角色及权限之间关系的配置,角色=权限1,权限2
admin=user:delete
提供了一个用户名为Mark的用户,密码123456,角色是admin,他的权限有user:delete
2. jdbcRealm
暂时略。
自定义realm。
加密
- 加密 md5
- 加盐
springboot整合shiro
参考:
http://www.ityouknow.com/springboot/2017/06/26/spring-boot-shiro.html
https://www.cnblogs.com/learnhow/p/9747134.html
https://github.com/whbing/shiro-security
利用拦截器,将需要认证的url拦截。
Shiro 配置
两种方式。使用配置类,或者spring注入xml方式都可以。
- 配置类
- xml