首页 体育 教育 财经 社会 娱乐 军事 国内 科技 互联网 房产 国际 女人 汽车 游戏

学习 Shiro(三):RBAC Realm

2020-01-19

在安排内部,一般运用 LDAP 目录服务,为安排供给一致的认证服务。

鉴权比较认证愈加的杂乱,体系往往需求灵敏可装备的权限。

能够经过自定义 Realm 完成以下功用:

下面是 org.apache.shiro.realm.Realm 接口承继体系:

承继 org.apache.shiro.realm.AuthenticatingRealm 笼统类,即表明该 Realm 支撑认证。

承继 org.apache.shiro.realm.AuthorizingRealm 笼统类,即表明该 Realm 支撑认证和鉴权。

认证需求完成 doGetAuthenticationInfo:AuthenticationInfo 笼统办法,鉴权需求完成 doGetAuthorizationInfo:AuthorizationInfo 笼统办法。

Shiro 供给了根据 LDAP 的 Realm 完成 org.apache.shiro.realm.ldap.DefaultLdapRealm 和根据 JDBC 的 Realm 完成 org.apache.shiro.realm.jdbc.JdbcRealm 。

自定义 Realm 能够经过承继 DefaultLdapRealm 类承继根据 LDAP 认证,经过掩盖根据 LDAP 授权完成根据 JDBC 的鉴权。

RBAC 是一种约束已认证用户体系拜访的办法。在 RBAC 中,实体、人物和权限之间的 ER 图如下所示:

Subject 与 Role 是多对多的联系,Role 和 Permission 是多对多的联系。

RBAC 的特色如下:

以 BI 体系为例:

小张是一名数据分析师,在 BI 体系平分配了数据分析师人物,数据分析师人物具有修改和检查报表的权限,小张能够修改和检查报表。

小王是一名事务,在 BI 体系平分配了事务人物,事务人物具有检查报表的权限,小王只能够检查报表不能够修改报表。

以 Spring Boot 集成 org.apache.shiro:shiro-spring-boot-web-starter 为例,演示怎么自定义 Realm。

创立数据库表:

create table if not exists users 
 id bigint auto_increment primary key,
 name varchar not null unique key
create table if not exists roles 
 id bigint auto_increment primary key,
 name varchar not null unique key
create table if not exists permissions 
 id bigint auto_increment primary key,
 name varchar not null unique key
create table if not exists user_roles 
 id bigint auto_increment primary key,
 user_id bigint not null,
 role_id bigint not null
create table if not exists role_permissions 
 id bigint auto_increment primary key,
 role_id bigint not null,
 permission_id bigint not null
);

创立 RBACRealm 类:

public class RBACRealm extends DefaultLdapRealm { // ①
 private DataSource dataSource;
 public void setDataSource {
 this.dataSource = dataSource;
 @Override
 protected AuthorizationInfo doGetAuthorizationInfo {
 if  {
 throw new AuthorizationException getAvailablePrincipal;
 if .length 0) {
 try ) {
 Set String roles = queryRolesByUsername; // ②
 Set String permissions = queryPermissionsByRoles; // ③
 SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo;
 simpleAuthorizationInfo.setStringPermissions;
 info = simpleAuthorizationInfo;
 } catch  {
 final String message = There was a IO error while loading sql from classpath 
 throw new AuthorizationException;
 } catch  {
 final String message = There was a SQL error while authorizing user [ + username + ] 
 throw new AuthorizationException;
 return info;
 private Set String queryRolesByUser throws SQLException, IOException {
 // 省掉查询
 private Set String queryPermissionsByUser throws IOException, SQLException {
 // 省掉查询
}

① 承继 org.apache.shiro.realm.ldap.DefaultLdapRealm 类,掩盖 doGetAuthorizationInfo:AuthorizationInfo 办法;

② 经过 JDBC 查询用户人物;

③ 经过 JDBC 查询用户权限。

热门文章

随机推荐

推荐文章