1、读取配置文件,初始化工厂
2、获取SecurityManager实例
3、SecurityManager绑定到SecurityUtils
4、获取到当前的用户
5、创建令牌 用户名/密码
public class HelloWorld {
public static void main(String[] args) {
//1、读取配置文件,初始化工厂
Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:shiro.ini");
//2、获取SecurityManager实例
SecurityManager securityManager=factory.getInstance();
//3、SecurityManager绑定到SecurityUtils
SecurityUtils.setSecurityManager(securityManager);
//4、获取到当前的用户
Subject currentUser =SecurityUtils.getSubject();
//5、创建令牌 用户名/密码
UsernamePasswordToken token=new UsernamePasswordToken("wby","123");
//6、
try{
currentUser.login(token);
System.out.println("身份验证成功");
}catch (AuthenticationException a){
a.getStackTrace();
System.out.println("身份验证失败");
}
}
}
Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。
| Subject | SecurityManager | Realm |
|---|---|---|
| 当前用户的安全操作 | Shiro通过SecurityManager来管理内部组件实例,并通过它来提供安全管理的各种服务 | Realm充当了Shiro与应用安全数据间的“桥梁”或者“连接器”。也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息 |
认证/授权基本步骤:
| 认证/授权基本步骤 |
|---|
| 1. 获取当前的 Subject,调用SecurityUtils.getSubject() |
| 2. 判断当前用户是否已经认证,调用 Subject 的 isAuthenticated(); |
| 3. 或没有被认证,则把用户名和密码封装为 UserNamePassworkToken 对象 |
| 4. 执行登录,调用 Subject 的 login(AuthencationToken); |
| 5. 自定义Realm 方法,从数据库中获用户安全数据 |
表结构见sql目录
[main]
jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm
dataSource=com.mchange.v2.c3p0.ComboPooledDataSource
dataSource.driverClass=com.mysql.jdbc.Driver
dataSource.jdbcUrl=jdbc:mysql://localhost:3306/db_shiro
dataSource.user=root
dataSource.password=root
jdbcRealm.dataSource=$dataSource
securityManager.realms=$jdbcRealm
shiro_realm.ini
[users]
wby=123,role1
hrb=123,role1,role2
public void testRole() {
Subject currenUser=ShiroUtil.login("classpath:shiro_role.ini","wby","123");
//判断用户是否有该角色
System.out.println(currenUser.hasRole("role1")+""+ currenUser.hasRole("role2"));
System.out.println();
//底层for循环调用hasRole
boolean[] results=currenUser.hasRoles(Arrays.asList("role1","role2","role3"));
System.out.println(results[0]);
System.out.println(results[1]);
System.out.println(results[2]);
//只要一个不存在就是false
boolean result=currenUser.hasAllRoles(Arrays.asList("role1","role2","role3"));
System.out.println(result);
}
@Test
public void testRole() {
Subject currenUser=ShiroUtil.login("classpath:shiro_permission.ini","wby","123");
//判断用户是否有该权限
System.out.println(currenUser.isPermitted("user:select")); //true
System.out.println(currenUser.isPermitted("user:delete")); //false
}
[users]
wby=123,role1
hrb=123,role1,role2
[roles]
role1=user:select
role2=user:add,user:update,user.delete
| @RequiresAuthentication | @RequiresGuest | @RequiresPermissions("account:create") | @RequiresRoles("administrator") | @RequiresUser RequiresUser |
|---|---|---|---|---|
| 要求当前 Subject 已经在当前的 session 中被验证通过才能被访问或调用。 | 要求当前的 Subject 是一个"guest",也就是说,他们必须是在之前的 session 中没有被验证或被记住才能被访问或调用 | 要求当前的 Subject 被允许一个或多个权限,以便执行注解的方法 | 要求当前的 Subject 被允许一个或多个权限,以便执行注解的方法 | 要求当前的 Subject 被允许一个或多个权限,以便执行注解的方法 |
页面先引入
<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
| Guest 标签 | User 标签 | Authenticated 标签 |
|---|---|---|
| 用户没有身份验证时显示相应信息,即游客访问信息 | 用户已经身份验证,记住我登录后显示相应的信息 | 用户已经身份验证通过,即 Subject.login 登录成功,不是记住我登录的 |
| notAuthenticated 标签 | principal 标签 | hasRole 标签 |
|---|---|---|
| 用户没有身份验证通过,即没有调用 Subject.login 进行登录,包括记住我自动登录的也属于未进行身份验证。 | 显示用户身份信息,默认调用 Subject.getPrincipal()获取,即 Primary Principal | 如果当前 Subject 有角色将显示 body 体内容 |
| lacksRole 标签 | hasAnyRoles 标签 | hasPermission 标签 | lacksPermission 标签 |
|---|---|---|---|
| 标签 如果当前 Subject 没有角色将显示 body 体内容 | 如果当前 Subject 有任意一个角色(或的关系)将显示 body 体内容 | 如果当前 Subject 有权限将显示 body 体内容 | 如果当前 Subject 没有权限将显示 body 体内容 |