一、创建一个SpringBoot
项目,并导入shiro
安全管理框架的maven
依赖包。在pom.xml
中添加如下依赖包:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
二、在src/main/resources
路径下创建一个shiro.ini
的配置文件,里面保存这shiro
的账户信息(账号、密码)、角色信息、权限信息。
-
在
shiro.ini
中配置账户、角色、权限等信息的硬编码方式,在实际开发中并不使用;实际开发中是保存在数据库中的。 -
product:view
、product:edit
不是shiro
框架中要求的语法,而是程序员的一种预定俗称的写法。例如:product:
就代表对应产品模块的权限,money:
就代表对应财务模块的权限。
提示:
src/main/resources
路径就是classpath
路径,所以可以通过classpath:shiro.ini
来定位shiro.ini
的文件的位置。
[users]
zhangsan=123,admin
lisi=123,public
[roles]
admin=product:view,product:edit,product:create,product:remove
public=product:view
三、在src/main/
路径下,javaboy.greamrod
包下创建MainApp
类,来搭建shiro
的简单使用案例。
package javaboy.greamrod;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.realm.text.IniRealm;
import org.apache.shiro.subject.Subject;
public class MainApp {
public static void main(String[] args) {
/**
* 1)搭建Shiro安全管理框架。
*/
//使用shiro提供的IniRealm创建对象,并读取shiro.ini中的配置信息
IniRealm realm = new IniRealm("classpath:shiro.ini");
//创建SecurityManager安全管理器对象,并注入realm对象
SecurityManager securityManager = new DefaultSecurityManager(realm);
//使用SecurityUtils将securityManager设置到运行环境中
SecurityUtils.setSecurityManager(securityManager);
/**
* 2)模拟用户的登录操作
*/
//创建token令牌,记录用户认证的身份和凭证即账号和密码
String username = "zhangsan";
String password = "123";
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
//创建一个Subject实例,该实例认证要使用上边创建的securityManager进行
Subject subject = SecurityUtils.getSubject();
System.err.println("Before login用户认证状态"+ subject.isAuthenticated());
//登录操作
subject.login(token);
System.err.println("After login用户认证状态"+ subject.isAuthenticated());
System.err.println("是否拥有[admin]角色 >>> "+ subject.hasRole("admin"));
List<String> roles = Arrays.asList("admin", "public");
System.err.println("是否拥有[admin、public]角色 >>> "+ Arrays.toString(subject.hasRoles(roles)));
System.err.println("是否拥有[product:view]权限 >>> "+ subject.isPermitted("product:view"));
boolean[] permissions = subject.isPermitted("product:view", "product:edit", "product:create", "product:remove");
System.err.println("是否拥有[product模块下view、edit、create、remove]权限 >>> " + Arrays.toString(permissions));
/**
* 模拟用户的登出操作
*/
//登出操作
subject.logout();
System.err.println("After logout用户认证状态"+ subject.isAuthenticated());
}
}
对应的输出如下:
Before login用户认证状态false
After login用户认证状态true
是否拥有[admin]角色 >>> true
是否拥有[admin、public]角色 >>> [true, false]
是否拥有[product:view]权限 >>> true
是否拥有[product模块下view、edit、create、remove]权限 >>> [true, true, true, true]
After logout用户认证状态false