protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); User user = (User) principals.getPrimaryPrincipal(); Role role = roleService.findByRoleId(user.getId()); authorizationInfo.addRole(role.getRole()); List<Permission> permissions = permissionService.listPermissionsByRoleId(role.getId()); //把权限的URL全部放到authorizationInfo中去 Set<String> urls = permissions.stream().map(p -> p.getUrl()).collect(Collectors.toSet()); authorizationInfo.addStringPermissions(urls); return authorizationInfo; }解释这段代码
时间: 2024-02-09 11:07:27 浏览: 27
这段代码是一个 Java 项目中的 Shiro 框架的授权方法 `doGetAuthorizationInfo` 的实现。在 Shiro 中,授权是指确定当前用户是否有权执行某个操作或访问某个资源。这个方法的作用是获取当前登录用户的角色信息和权限信息,并将其封装为 `AuthorizationInfo` 对象返回。
具体来说,这个方法接收一个 `PrincipalCollection` 参数,其中包含了当前用户的身份信息,即 `User` 对象。首先,它通过调用 `roleService.findByRoleId(user.getId())` 方法获取当前用户所属的角色 `Role` 对象,并将其添加到 `authorizationInfo` 中。
接着,它通过调用 `permissionService.listPermissionsByRoleId(role.getId())` 方法获取当前角色所拥有的权限 `Permission` 对象列表,然后将这些权限的 URL 信息提取出来,用 `Collectors.toSet()` 方法转换为一个 `Set<String>` 集合,并将其添加到 `authorizationInfo` 中。
最后,该方法返回一个封装了当前用户角色和权限信息的 `authorizationInfo` 对象。这个对象会在 Shiro 进行授权时被用到,用于判断当前用户是否有权执行某个操作或访问某个资源。
相关问题
SecurityUtils.getSubject().Principals()为null
您在代码中使用了`SecurityUtils.getSubject().getPrincipals()`方法,但返回值为`null`。这可能是由于以下原因之一:
1. 用户未登录:在调用此方法之前,必须确保用户已经成功登录。如果用户未登录或会话已过期,那么`getSubject()`方法将返回一个未经身份验证的主体对象,其`getPrincipals()`方法返回`null`。
2. 未配置正确的身份验证和授权机制:如果您没有正确配置Shiro的身份验证和授权机制,那么可能无法获取到正确的主体对象和凭证。请确保您已正确配置了Shiro的`SecurityManager`、`Realm`和`SessionManager`等组件。
3. 未设置Principal:如果用户已成功登录,但没有设置主体对象的Principal(身份标识),那么`getPrincipals()`方法将返回`null`。请确保您在用户登录时设置了正确的Principal。
请检查上述原因,并根据情况进行相应的调整和修复。如果问题仍然存在,请提供更多相关的代码和配置信息,以便我们能够更好地帮助您解决问题。
解释一下这段代码 use [GTA_SHFECOL2_TAQ_202001] GO IF EXISTS (SELECT * FROM sys.database_principals WHERE name = N'gtadar') DROP USER [gtadar] GO CREATE USER [gtadar] FOR LOGIN [gtadar] GO EXEC sp_addrolemember N'db_datareader', N'gtadar'
这段代码是用于管理数据库用户和权限的。具体释如下:
1.一行使用了 `use` 关键字,指定要操作的数据库为 `GTA_SHFECOL2_TA_202001`。这一个数据库名称,可能是一个交易数据的。
2. 第三行使用了 `IF EXISTS` 条件语句,用于检查是否存在名为 `gtadar` 的数据库用户。如果存在,则执行下一行的 `DROP USER` 语句,删除该用户。否则,跳过该步骤。
3. 第五行使用 `CREATE USER` 语句,创建一个名为 `gtadar` 的数据库用户。这个用户是基于一个名为 `gtadar` 的登录账户创建的。
4. 第七行使用 `EXEC sp_addrolemember` 语句,将 `gtadar` 用户添加到 `db_datareader` 角色中。这样,`gtadar` 用户就具有了读取数据库数据的权限。
总结来说,这段代码的作用是在 `GTA_SHFECOL2_TAQ_202001` 数据库中创建一个名为 `gtadar` 的用户,并给予其读取数据的权限。如果该用户已经存在,则先删除再重新创建。