【Shiro】04 ini授权实现

【授权概念】

访问控制,即在应用中控制谁能访问哪些资源(如访问页面/编辑数据/页面操作等)。

在授权中需了解的几个关键对象:主体(Subject)、资源(Resource)、权限(Permission)、角色(Role)。

授权的前提是认证通过。

(简单说,我只有进系统了我才能知道我可以做什么,系统都进不了怎么授权)

【关键对象】

1,主体

主体,即访问应用的用户,在Shiro中使用Subject代表该用户。

用户只有授权后才允许访问相应的资源。

2,资源

在应用中用户可以访问的任何东西,

比如访问JSP 页面、查看/编辑某些数据、访问某个业务方法、打印文本等等都是资源。

用户只要授权后才能访问。

3,权限

安全策略中的原子授权单位,通过权限我们可以表示在应用中用户有没有操作某个资源的权力。

即权限表示在应用中用户能不能访问某个资源,

如:访问用户列表页面查看/新增/修改/删除用户数据(即很多时候都是CRUD(增查改删)式权限控制)打印文档等等。。。

4,角色

角色代表了操作集合,可以理解为权限的集合,

一般情况下我们会赋予用户角色而不是权限,即这样用户可以拥有一组权限,赋予权限时比较方便。

典型的如:项目经理、技术总监、CTO、开发工程师等都是角色,不同的角色拥有一组不同的权限。

【授权流程】

 

 

【相关方法】

1 subject.hasRole(""); 
判断是否有角色

2 subject.hashRoles(List);
分别判断用户是否具有List中每个内容

3 subject.hasAllRoles(Collection);
返回boolean,要求参数中所有角色用户都需要具有.

4 subject.isPermitted("");
判断是否具有权限.

【shiro.ini配置】

#配置用户
[users]
admin=123456,role1
user01=123456,role2
user02=123456,role3
user03=123456,role2,role3

#声明角色
[roles]
role1=user:query,user:add,user:update,user:delete,user:export
role2=user:query,user:add
role3=user:query,user:export

测试类编写:

    // 日志输出工具
    private static final transient Logger log = LoggerFactory.getLogger(AuthenticationTest.class);

    @SuppressWarnings("deprecation")
    public static void main(String[] args) {
        String username = "admin";
        String password = "123456";
        log.info("My First Apache Shiro Application");

        DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
        defaultSecurityManager.setRealm(new IniRealm("classpath:shiro.ini"));
        SecurityUtils.setSecurityManager(defaultSecurityManager);

        Subject subject = SecurityUtils.getSubject();

        try {
            subject.login(new UsernamePasswordToken(username, password));
            log.info("登陆成功");
        } catch (AuthenticationException authenticationException) {
            authenticationException.printStackTrace();
            log.error("用户名称或者密码不符合");
        }

        // 是否认证通过
        boolean authenticated = subject.isAuthenticated();
        log.info("是否认证通过:"+authenticated);

        // 角色验证
        boolean hasRole1 = subject.hasRole("role1");
        log.info("是否有role1的角色:"+hasRole1);

        //分别判断集合里面的角色 返回数组
        List<String> roleIdentifiers= Arrays.asList("role1","role2","role3");
        boolean[] hasRoles = subject.hasRoles(roleIdentifiers);
        for (boolean hasRole : hasRoles) {
            log.info(String.valueOf(hasRole));
        }

        //判断当前用户是否有roleIdentifiers集合里面的所有角色
        boolean hasAllRoles = subject.hasAllRoles(roleIdentifiers);
        log.info(String.valueOf(hasAllRoles));

        // ----------------------------------------------------------

        //权限判断
        boolean permitted = subject.isPermitted("user:query");
        log.info("判断当前用户是否有user:query的权限  "+permitted);

        boolean[] permitted2 = subject.isPermitted("user:query","user:add","user:export");
        for (boolean b : permitted2) {
            log.info(String.valueOf(b));
        }

        boolean permittedAll = subject.isPermittedAll("user:query","user:add","user:export");
        log.info(String.valueOf(permittedAll));

    }

测试结果:

[main] INFO AuthenticationTest - My First Apache Shiro Application
[main] INFO org.apache.shiro.session.mgt.AbstractValidatingSessionManager - Enabling session validation scheduler...
[main] INFO AuthenticationTest - 登陆成功
[main] INFO AuthenticationTest - 是否认证通过:true
[main] INFO AuthenticationTest - 是否有role1的角色:true
[main] INFO AuthenticationTest - true
[main] INFO AuthenticationTest - false
[main] INFO AuthenticationTest - false
[main] INFO AuthenticationTest - false
[main] INFO AuthenticationTest - 判断当前用户是否有user:query的权限  true
[main] INFO AuthenticationTest - true
[main] INFO AuthenticationTest - true
[main] INFO AuthenticationTest - true
[main] INFO AuthenticationTest - true

Process finished with exit code 0

 

posted @ 2020-08-01 18:02  emdzz  阅读(157)  评论(0编辑  收藏  举报