Shiro(2)---授权

本文介绍Shiro框架的权限管理机制,包括编程式、注解式和JSP/GSP标签授权方式,以及基于角色和资源的权限控制实现。通过示例演示了如何配置Shiro并进行权限检查。

Shiro授权

1.授权流程

这里写图片描述

2.授权方式

Shiro 支持三种方式的授权:

1.编程式:通过写if/else 授权代码块完成:
Subject subject = SecurityUtils.getSubject();
if(subject.hasRole(“admin”)) {
//有权限
} else {
//无权限
}
2.注解式:通过在执行的Java方法上放置相应的注解完成:
@RequiresRoles("admin")
public void hello() {
//有权限的操作
}
3.JSP/GSP 标签:在JSP/GSP 页面通过相应的标签完成:####  
<shiro:hasRole name="admin">
<!— 有权限—>
</shiro:hasRole>

3.入门测试程序

测试分为基于角色的权限控制和基于资源的权限控制(开发中建议使用)

1. 创建shiro-permission.ini文件模拟数据源
#用户
[users]
#用户zhang的密码是123,此用户具有role1和role2两个角色
zhang=123,role1,role2
wang=123,role2

#权限
[roles]
#角色role1对资源user拥有createupdate权限
role1=user:create,user:update
#角色role2对资源user拥有createdelete权限
role2=user:create,user:delete
#角色role3对资源user拥有create权限
role3=user:create

权限标识符号规则:资源:操作:实例(中间使用半角:分隔)
user:create:01 表示对用户资源的01实例进行create操作。
user:create 表示对用户资源进行create操作,相当于user:create:*,对所有用户资源实例进行create操作。
user:*:01 表示对用户资源实例01进行所有操作。

2. 测试代码
public void testPermission(){
        //根据ini文件创建SecurityManagerFactory
        Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro-realm.ini");
        SecurityManager securityManager = factory.getInstance();
        //将securityManager设置到运行环境中
        SecurityUtils.setSecurityManager(securityManager);
        //创建主体对象
        Subject subject = SecurityUtils.getSubject();
        //有身份和凭证信息生成一个token
        UsernamePasswordToken token = new UsernamePasswordToken("zhang", "123");
        try {
            subject.login(token);
        } catch (AuthenticationException e) {
            e.printStackTrace();
        }
        boolean isAuthenticated = subject.isAuthenticated();
        System.out.println("用户认证状态: "+isAuthenticated);
        //基于角色的权限控制
        boolean isHasRole1 = subject.hasRole("role1");
        System.out.println("是否有role1角色: "+isHasRole1);
        boolean hasAllRoles = subject.hasAllRoles(Arrays.asList("role1","role2","role3"));
        System.out.println("是否有所有角色: "+hasAllRoles);
        //使用check进行授权,如果授权失败则拋异常
        subject.checkRole("role1");
        subject.checkRoles("role1","role2");
        //基于资源的权限控制
        boolean isPermitted = subject.isPermitted("user:create");
        System.out.println("是否拥有该权限: "+isPermitted);
        boolean isPermittedAll = subject.isPermittedAll("user:create:1","user:delete");
        System.out.println("是否拥有所有的权限: "+isPermittedAll);
        //使用check进行授权,如果授权失败则拋异常
        subject.checkPermission("user:create");
        subject.checkPermissions("user:create","user:delete");
    }

4.自定义realm

这里用到的是基于资源的权限控制
1.在自定义realm完善doGetAuthorizationInfo()方法

// 授权
    protected AuthorizationInfo doGetAuthorizationInfo(
            PrincipalCollection principals) {
        //获取身份信息
        String principal = (String)principals.getPrimaryPrincipal();
        //根据身份信息从数据库中获取权限数据
        //使用静态数据进行模拟...
        List<String> permissions = new ArrayList<String>();
        permissions.add("user:create");
        permissions.add("user:delete");
        SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
        //将权限数据封装到SimpleAuthorizationInfo对象中
simpleAuthorizationInfo.addStringPermissions(permissions);
        return simpleAuthorizationInfo;
    }

2.ini配置文件还使用认证阶段使用的,不用改变。

[main]
#自定义realm
customRealm=com.ak.shiro.CustomRealm
#将realm设置到securityManager
securityManager.realms=$customRealm

5.授权流程

1、对subject进行授权,调用方法isPermitted(”permission串”)

2、SecurityManager执行授权,通过ModularRealmAuthorizer执行授权

3、ModularRealmAuthorizer执行realm(自定义的CustomRealm)从数据库查询权限数据
  调用realm的授权方法:doGetAuthorizationInfo

4、realm从数据库查询权限数据,并返回给ModularRealmAuthorizer

5、ModularRealmAuthorizer调用PermissionResolver进行权限串比对

6、如果比对后,isPermitted中”permission串”在realm查询到权限数据中,说明用户访问permission串有权限,否则 没有权限,抛出异常。

## 软件功能详细介绍 1. **文本片段管理**:可以添加、编辑、删除常用文本片段,方便快速调用 2. **分组管理**:支持创建多个分组,不同类型的文本片段可以分类存储 3. **热键绑定**:为每个文本片段绑定自定义热键,实现一键粘贴 4. **窗口置顶**:支持窗口置顶功能,方便在其他应用程序上直接使用 5. **自动隐藏**:可以设置自动隐藏,减少桌面占用空间 6. **数据持久化**:所有配置和文本片段会自动保存,下次启动时自动加载 ## 软件使用技巧说明 1. **快速添加文本**:在文本输入框中输入内容后,点击"添加内容"按钮即可快速添加 2. **批量管理**:可以同时编辑多个文本片段,提高管理效率 3. **热键冲突处理**:如果设置的热键与系统或其他软件冲突,会自动提示 4. **分组切换**:使用分组按钮可以快速切换不同类别的文本片段 5. **文本格式化**:支持在文本片段中使用换行符和制表符等格式 ## 软件操作方法指南 1. **启动软件**:双击"大飞哥软件自习室——快捷粘贴工具.exe"文件即可启动 2. **添加文本片段**: - 在主界面的文本输入框中输入要保存的内容 - 点击"添加内容"按钮 - 在弹出的对话框中设置热键和分组 - 点击"确定"保存 3. **使用热键粘贴**: - 确保软件处于运行状态 - 在需要粘贴的位置按下设置的热键 - 文本片段会自动粘贴到当前位置 4. **编辑文本片段**: - 选中要编辑的文本片段 - 点击"编辑"按钮 - 修改内容或热键设置 - 点击"确定"保存修改 5. **删除文本片段**: - 选中要删除的文本片段 - 点击"删除"按钮 - 在确认对话框中点击"确定"即可删除
提供的引用内容中未提及Shiro安全白名单(Shiro security - whitelist)的相关信息。不过,Shiro安全白名单通常是指在Shiro的权限控制体系中,设置一些不需要进行认证或授权就可以访问的资源列表。 在Shiro的配置中,一般可以通过配置过滤器链来实现白名单功能。例如,在Java代码中可以这样配置: ```java import org.apache.shiro.mgt.SecurityManager; import org.apache.shiro.spring.web.ShiroFilterFactoryBean; import org.apache.shiro.spring.web.config.DefaultShiroFilterChainDefinition; import org.apache.shiro.spring.web.config.ShiroFilterChainDefinition; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class ShiroConfig { @Bean public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) { ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); shiroFilterFactoryBean.setSecurityManager(securityManager); // 配置白名单 DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition(); // 以下是白名单配置示例,这些路径不需要认证即可访问 chainDefinition.addPathDefinition("/static/**", "anon"); chainDefinition.addPathDefinition("/login", "anon"); shiroFilterFactoryBean.setFilterChainDefinitionMap(chainDefinition.getFilterChainMap()); return shiroFilterFactoryBean; } @Bean public ShiroFilterChainDefinition shiroFilterChainDefinition() { return new DefaultShiroFilterChainDefinition(); } } ``` 在上述代码中,`anon` 过滤器表示该路径是白名单路径,不需要进行认证就可以访问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值