Shiro安全管理框架(一)

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

原文 

https://juejin.im/post/5f12fd27e51d453488382855

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » Shiro安全管理框架(一)

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址