shiro表结构设计_基于shiro RBAC的表设计

本文介绍了如何利用Shiro实现RBAC权限控制,通过用户组来管理用户与角色的多对多关系,简化权限维护。详细阐述了自定义Shiro Realm的实现过程,包括授权和认证方法,并给出了获取角色权限的SQL查询。同时展示了控制器中使用@RequiresRoles注解进行权限验证的例子。
摘要由CSDN通过智能技术生成

权限控制的核心是RBAC,但是同个用户可能具有多个角色,一个角色也可能关联多个用户。而这多与多的关联关系维护起来特别麻烦,依照指定的角色具有的功能是相似的,所以在角色与用户之间,添加了用户组来进行中介进行管控。

rbac.jpg

实现Shiro自定义Realm

public class ShiroRealm extends AuthorizingRealm {

@Autowired

private UserEntityMapper userEntityMapper;

@Autowired

private RoleService roleService;

/**

* 授权

* @param principals

* @return

*/

@Override

protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {

String userId = (String) principals.getPrimaryPrincipal();

UserRoleFlag userRoleFlag = roleService.getUserRoleFlags(userId);

return new SimpleAuthorizationInfo(userRoleFlag.getRoleFlags());

}

/**

* 登录认证

* @param token

* @return

* @throws AuthenticationException

*/

@Override

protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {

String principal = (String) token.getPrincipal();

System.out.println("登录校验:" + principal);

UserEntity entity = userEntityMapper.findByUsername(principal);

if (null == entity) {

throw new UnknownAccountException("未找到该用户!");

}

System.out.println("获取到用户进行校验....");

return new SimpleAuthenticationInfo(principal, entity.getPassword(), getName());

}

}

获取角色权限SQL

SELECT

d.*

FROM

sys_user_user_group a

INNER JOIN sys_user_group b ON a.user_group_id = b.id

INNER JOIN sys_role_user_group c ON a.user_group_id = c.user_group_id

INNER JOIN sys_role d ON c.role_id = d.id

WHERE

b.`status` = 1

AND d.`status` = 1

AND a.user_id = #{userId}

进行权限验证

com.example.hrh.module.sys.controllers.TestController

必须指定角色权限认证

@RequiresRoles("admin")

@RequestMapping("perm/admin")

public String testAdmin() {

System.out.println(SecurityUtils.getSubject().getPrincipal());

return "admin权限";

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值