Shiro是一个Java安全框架,用于身份认证、授权和会话管理等安全特性。它为开发人员提供了一套简单易用的API,可以集成到Java应用程序中,以实现对用户身份认证、权限控制和会话管理的支持。Shiro提供了一系列的组件和工具,可以帮助开发人员构建安全的应用程序,并处理常见的安全问题。
本文根据shiro官网的指南,示例快速上手
官网指南:https://shiro.apache.org/tutorial.html
1 引入依赖
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.12.0</version>
</dependency>
2 配置shiro
2.1 配置文件方式
配置文件 shiro.ini
[users]
root = secret, admin
guest = guest, guest
presidentskroob = 12345, president
darkhelmet = ludicrousspeed, darklord, schwartz
lonestarr = vespa, goodguy, schwartz
[roles]
admin = *
schwartz = lightsaber:*
goodguy = winnebago:drive:eagle5
demo:
// 给工厂指定配置文件
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
// 工厂根据配置文件创建对应的Shiro的安全管理类对象
SecurityManager securityManager = factory.getInstance();
// 把对象保存到工具类中,以便后续调用
SecurityUtils.setSecurityManager(securityManager);
3 使用shiro
3.1 获取当前用户-Subject
要管理好应用的安全问题,就必须的要确认“当前用户是谁?”或者“当前用户是否可以进行当前操作?”。
所以我们应用的安全是基于“当前用户”的。
获取当前用户--Subject对象:
Subject currentUser = SecurityUtils.getSubject();
Subject对象是保存在 ThreadLocal 的,这里的 SecurityUtils.getSubject() 是把 Subject 对象从当前线程的 ThreadLocal 中取出来。
3.2 会话信息-Session
Session session = currentUser.getSession();
session.setAttribute( "someKey", "aValue" );
这个 Session 是一个特定于Shiro的实例,提供了大多数您在常规 HttpSessions 中使用的功能,但还有一些额外的好处和一个重要的区别:它不需要HTTP环境!
3.3 登录-保存用户的信息
if ( !currentUser.isAuthenticated() ) {
//collect user principals and credentials in a gui specific manner
//such as username/password html form, X509 certificate, OpenID, etc.
//We'll use the username/password example here since it is the most common.
UsernamePasswordToken token = new UsernamePasswordToken("lonestarr", "vespa");
//this is all you have to do to support 'remember me' (no config - built in!):
token.setRememberMe(true);
currentUser.login(token);
}
3.4 查看用户的信息
获取名称:
String userName = currentUser.getPrincipal();
判断是否有指定角色:
boolean flag = currentUser.hasRole( "schwartz" );
判断是否有指定权限:
boolean flag = currentUser.isPermitted( "lightsaber:wield" );
3.5 退出登录
//removes all identifying information and invalidates their session too.
currentUser.logout();
注意:本文归作者所有,未经作者允许,不得转载