问候所有我使用的Spring安全3.0.2,我想登录后获得用户权限,并添加另一个角色给他,这样他就可以访问一些页面,需要新的角色如何做到这一点?
kpbpu0081#
我在这里玩了一下这个方法:User Granted Authorities are always : ROLE_ANONYMOUS?而且效果很好
lg40wkob2#
您必须创建身份验证提供程序,从数据库加载权限数据。在stackoverflow question中,您可以看到如何做到这一点。当你需要更改用户权限时,你只需要更改数据库中的数据。
deikduxw3#
@Javi:我不知道如何评论你的答案,所以我不得不创建一个新的。您的解决方案的问题是用户必须注销并重新登录才能获得新角色。我认为sword 101试图实现的是动态地为用户添加一个新角色,而不需要重新登录。然而,这也是我正在研究的一个问题,到目前为止还没有找到合适的解决方案。我尝试在我的(自定义)UserDetails对象中使用一个标志来实现它。这面旗帜由投票人阅读并相应地投票。但这并没有像预期的那样奏效。不过,我会再调查一下,看看出了什么问题。
3okqufwl4#
只是偶然发现了这一点,并会回答它,即使它是一个有点旧。一种简单的方法是检索用户的身份验证对象(沿着此权限)并构造一个新的身份验证对象。这可以像这样设置回上下文:
Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); List<GrantedAuthority> combinedAuthorities = new ArrayList<>(); combinedAuthorities.addAll(authentication.getAuthorities()); combinedAuthorities.add(new SimpleGrantedAuthority("BRAND_NEW_ROLE")); UsernamePasswordAuthenticationToken newAuthenticationWithAddedRole = new UsernamePasswordAuthenticationToken(authentication.getPrincipal(), authentication.getCredentials(), combinedAuthorities); SecurityContextHolder.getContext().setAuthentication(newAuthenticationWithAddedRole);
(为了清楚起见,可以这样写,可以缩短)。现在很明显,这只在用户发出的请求的上下文中起作用(否则(SecurityContextHolder.getContext()将无法获得正确的身份验证),但我假设这没有问题,因为这是作为用户触发的登录的一部分完成的。我在这个例子中使用了简单的UsernamePasswordAuthenticationToken,但是当然还有其他Spring的默认实现。您可能应该使用您的代码目前已经使用的相同实现。但根据我的经验,你通常最终还是会为“身份验证”接口编写自己的实现,所以希望这不是问题。
4条答案
按热度按时间kpbpu0081#
我在这里玩了一下这个方法:
User Granted Authorities are always : ROLE_ANONYMOUS?
而且效果很好
lg40wkob2#
您必须创建身份验证提供程序,从数据库加载权限数据。在stackoverflow question中,您可以看到如何做到这一点。当你需要更改用户权限时,你只需要更改数据库中的数据。
deikduxw3#
@Javi:我不知道如何评论你的答案,所以我不得不创建一个新的。
您的解决方案的问题是用户必须注销并重新登录才能获得新角色。我认为sword 101试图实现的是动态地为用户添加一个新角色,而不需要重新登录。
然而,这也是我正在研究的一个问题,到目前为止还没有找到合适的解决方案。
我尝试在我的(自定义)UserDetails对象中使用一个标志来实现它。这面旗帜由投票人阅读并相应地投票。但这并没有像预期的那样奏效。不过,我会再调查一下,看看出了什么问题。
3okqufwl4#
只是偶然发现了这一点,并会回答它,即使它是一个有点旧。
一种简单的方法是检索用户的身份验证对象(沿着此权限)并构造一个新的身份验证对象。这可以像这样设置回上下文:
(为了清楚起见,可以这样写,可以缩短)。
现在很明显,这只在用户发出的请求的上下文中起作用(否则(SecurityContextHolder.getContext()将无法获得正确的身份验证),但我假设这没有问题,因为这是作为用户触发的登录的一部分完成的。
我在这个例子中使用了简单的UsernamePasswordAuthenticationToken,但是当然还有其他Spring的默认实现。您可能应该使用您的代码目前已经使用的相同实现。但根据我的经验,你通常最终还是会为“身份验证”接口编写自己的实现,所以希望这不是问题。