Shiro入门9:Shiro授权流程和三种授权方式和权限标识符规则

来源:互联网 发布:易语言彩票预测源码 编辑:程序博客网 时间:2024/06/06 12:28
    |---Shiro授权流程
        |---构造SecurityManager环境
        |---Subject.isPermited()授权
        |---SecurityManager.isPermited()执行授权
        |---Authorizer执行授权
        |---Realm根据身份获取资源权限信息






此文老猫原创,转载请加本文连接:http://blog.csdn.net/nthack5730/article/details/51019451
更多有关老猫的文章:http://blog.csdn.net/nthack5730

三种授权方式


编程式:通过写if/else授权代码快完成

Edit
    Subject subject = SecurityUtils.getSubject();
    if(subject.hasRole("admin")){
        //有权限
    } else{
        //无权限
    }



注解式:通过在执行的JAVA方法上放置相应的注解完成

Edit
@RequiresRoles("admin")
public void hello(){
    //有权限
}



JSP/GSP标签:在JSP/GSP页面通过相应的标签完成

Edit
<shiro:hasRole name="admin">
    <!-- 有权限 -->
</shiro:hasRole>



需要ini配置文件:shiro-permission.ini【相当于在数据库】


shiro-permission.ini

#用户
[users]
#用户zhang的密码是123,此用户具有role1和role2两个角色
zhang=123,role1,role2
wang=123,role2

#权限
[roles]
#角色role1对资源user拥有create、update权限
role1=user:create,user:update
#角色role2对资源user拥有create、delete权限
role2=user:create,user:delete
#角色role3对资源user拥有create权限
role3=user:create
关于上面的权限标识符,下面有对应的解释


权限标识符号规则:【中间用“:”(半角冒号分隔)】

        |---资源:操作【user:create:表示对用户资源进行create操作】【等价于:user:create:*(对所有的用户实例进行操作)】
        |---资源:操作:实例【user:create:01:表示对用户资源的01实例进行create操作】
        |
        |---例子:【user:*:01表示对用户资源的01实例进行所有操作】



静态、Junit测试类

Edit

import java.util.Arrays;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authz.AuthorizationException;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
import org.junit.Test;

public classAuthorizationTest {

//授权测试:角色授权、资源授权
@Test
public void testAuthorization(){
//创建一个SecurityManager工厂
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro-perimission.ini");

//创建SecurityManager
SecurityManager sm = factory.getInstance();

//将SecurityManager设置到系统运行环境,和Spring整合后将SecurityManager配置到Spring容器中,一般单例管理
SecurityUtils.setSecurityManager(sm);

//创建Subject
Subject subject = SecurityUtils.getSubject();

//创建token令牌
UsernamePasswordToken token = new UsernamePasswordToken("zhangsan","11111");

//执行认证
try {
subject.login(token);
} catch (AuthenticationException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}

System.out.println("认证状态:" + subject.isAuthenticated());


//认证通过后执行授权

//===========================================
// 基于角色授权
//===========================================
//hasRole方法传入的是角色标识
boolean isHasRole = subject.hasRole("role1");
System.out.println("正确角色,角色有权限--->" + isHasRole);

//传入错误的角色
boolean isHasRole2 = subject.hasRole("role12");
System.out.println("错误角色,角色有权限--->" + isHasRole2);

//判断多个角色
boolean hasAllRoles = subject.hasAllRoles(Arrays.asList("role1","role2"));
System.out.println("多个角色判断--->" + hasAllRoles);

//使用check方法进行授权,如果不通过,会抛出异常
// try {
// subject.checkRole("role12");
// } catch (AuthorizationException e) {
// // TODO 自动生成的 catch 块
// e.printStackTrace();
// }


//===========================================
// 基于资源授权
//===========================================
//传入的是资源标识符,单个权限判断
boolean isPermited = subject.isPermitted("user:create:1");
System.out.println("资源有权限,单个权限判断--->" + isPermited);

//传入的是资源标识符,多个权限判断
boolean isPermitedAll = subject.isPermittedAll("user:create","user:update","user:delete");
System.out.println("资源有权限,多个权限判断--->" + isPermitedAll);

//资源权限也支持check,如果不通过,也会抛异常
try {
subject.checkPermission("item:create");
} catch (AuthorizationException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}


subject.getPrincipal();

}//method

}


此文老猫原创,转载请加本文连接:http://blog.csdn.net/nthack5730/article/details/51019451

更多有关老猫的文章:http://blog.csdn.net/nthack5730



2 0