一、Shiro授权:
标题1、授权与权限:
(1)授权:访问控制,必须具有该资源的访问权限才可以访问该资源。
(2)权限模型:标准权限数据模型包括 :用户、角色、权限(包括资源和权限)、用户角色关系、角色权限关系。
(3)权限分配:通过UI界面方便给用户分配权限,对上边权限模型进行增、删、改、查操作。
(4)权限控制:
第一种:基于角色的权限控制:根据角色判断是否有操作权限,因为角色的变化性较高,如果角色修改需要修改控制代码,系统可扩展性不强。
第二种:基于资源的权限控制:根据资源权限判断是否有操作权限,因为资源较为固定,如果角色修改或角色中权限修改不需要修改控制代码,使用此方法系统可维护性很强。建议使用。
(5)权限管理的解决方案:
①对于粗颗粒权限管理,建议在系统架构层面去解决,写系统架构级别统一代码(基础代码)。
粗颗粒权限:比如对系统的url、菜单、jsp页面、页面上按钮、类方法进行权限管理,即对资源类型进行权限管理。
②对于细颗粒权限管理:细颗粒权限管理是系统的业务逻辑,业务逻辑代码不方便抽取统一代码,建议在系统业务层进行处理。
粗颗粒权限:比如用户id为001的用户信息(资源实例)、类型为t01的商品信息(资源实例),对资源实例进行权限管理,可以理解为对数据级别的权限管理。
2、授权流程:
(1)对subject进行授权,调用方法isPermitted(“permission串”);
(2)SecurityManager执行授权,通过ModularRealmAuthorizer执行授权;
(3)ModularRealmAuthorizer执行realm(自定义的CustomRealm)从数据库查询权限数据,调用realm的授权方法:doGetAuthorizationInfo;
(4)realm从数据库查询权限数据,返回ModularRealmAuthorizer;
(5)ModularRealmAuthorizer调用PermissionResolver进行权限串比对;
(6)如果比对后,isPermitted中"permission串"在realm查询到权限数据中,说明用户访问permission串有权限,否则 没有权限,抛出异常。
3、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>