一、创建一个 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 复制代码