我无法在@PreAuthorize
注释中使用hasRole
方法。还有请求。iUserInRole(“ADMIN”)
给出false
。我错过了什么?尽管。hasAuthority(“ADMIN”)
工作正常。
我正在从数据库中为用户分配权限。
我不得不即兴发挥一点,也许还有其他比我更简单的方法,但是在我从事这项工作的时候,我别无选择,只能即兴发挥一点,经过彻底的研究,我想出了这个解决方案。Spring Security有一个名为“访问决策管理器”的接口,您需要实现它。
@Component
public class RolesAccessDecisionManager implements AccessDecisionManager {
private final static String AUTHENTICATED = "authenticated";
private final static String PERMIT_ALL = "permitAll";
@Override
public void decide(Authentication authentication, Object o, Collection<ConfigAttribute> collection) throws AccessDeniedException, InsufficientAuthenticationException {
collection.forEach(configAttribute -> {
if (!this.supports(configAttribute))
throw new AccessDeniedException("ACCESS DENIED");
});
}
@Override
public boolean supports(ConfigAttribute configAttribute) {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication != null && authentication.isAuthenticated()) {
String rolesAsString = authentication.getAuthorities().stream().map(GrantedAuthority::getAuthority).collect(Collectors.joining(","));
if (configAttribute.toString().contains(rolesAsString))
return true;
else
return (configAttribute.toString().contains(PERMIT_ALL) || configAttribute.toString().contains(AUTHENTICATED));
}
return true;
}
@Override
public boolean supports(Class<?> aClass) {
return true;
}
}
现在,要在安全配置中支持此自定义访问决策管理器,请在安全配置中执行以下操作:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
// other configs
.accessDecisionManager(this.accessDecisionManager)
accessDecisionManager
是您创建的accessDecisionManager
实现的自动连接bean。
您可以使用hasRole()
或hasAuthority()
。区别在于,对于hasosthority()
方法,您必须使用ROLE
。
所以对于角色_ADMIN
,
java prettyprint-override"> @PreAuthorize("hasRole('ADMIN')") == @PreAuthorize("hasAuthority('ROLE_ADMIN')")
您必须使用前缀角色
命名您的权限,才能使用iUserInRole
,请参阅Spring Security参考:
HttpServletRequest。isUserInRole(字符串)将确定是否SecurityContextHolder。getContext()。getAuthentication()。GetAuthories()
包含一个GrantedAuthority
,角色被传递到isUserInRole(String)
。通常情况下,用户不应将“ROLE_”前缀传入此方法,因为它是自动添加的。例如,如果要确定当前用户是否具有“ROLE_ADMIN”权限,可以使用以下命令:
boolean isAdmin = httpServletRequest.isUserInRole("ADMIN");
同样适用于hasRole
(也适用于hasAnyRole
),请参见Spring Security参考:
如果当前主体具有指定的角色,则返回true
。默认情况下,如果提供的角色不是以“角色”开头,则会添加该角色。这可以通过修改DefaultWebSecurityExpressionHandler
上的defaultRolePrefix
进行定制。
我试图保护我的Spring启动应用程序(1.21)看起来像我的antMatcher("/报告**"). hasRole("报告")的一些URL模式被忽略。 e、 g.如果我浏览到localhost:9000/report/books之类的内容,我需要登录,它只适用于我的用户名密码组合,但我没有将角色报告设置为我的用户“user”。所以我希望我不被允许访问报告网站,但页面会显示出来。 我必须如何更改
在我的服务器中。xml我有以下配置: 认证后我的主题是这样的: 组 ID 是由我的自定义登录模块设置的,因为 ldap 注册表中的组在具有成员的属性中没有条目,因此不是由标准 Liberty 登录模块设置的。因此,在我的自定义模块中,我在LDAP中搜索用户,并将条目的组添加到私有凭据的groupIds数组中: 我还需要做些什么吗?或者只需要将组的字符串添加到数组中就足够了? 我还尝试使用secur
我正在努力学习Symfony的角色和安全性。我当前的security.yml文件如下所示: 我正在为我的用户使用这个设置: 这是我的问题。我一直缺少安全性的访问控制部分,但是,角色标记为ROLE\u admin的路径将允许用户person访问路由,即使该用户没有ROLE\u admin的角色。我想知道这是否是因为路由本身与路由由同一控制器共享?或者有人看到我的代码哪里出了问题,因为用户可以访问他们
我正在试图理解一些Spring Security代码。我也是Spring Security的新手,我想我在这里遗漏了一些基本的东西。 谢谢,雷。
我需要使用登录的员工的角色在jsp页面中隐藏导航。应用程序使用单点登录登录。我将只从另一个应用程序获得用户的用户名,我将使用该应用程序在数据库中搜索以获得员工的详细信息。我在employee表中有一个role列,我目前正在javascript中使用它来显示和隐藏导航。如何设置spring security role并在jsp标记中使用“hasRole('any role')”,以显示或隐藏导航。我
我添加了基于方法的安全性和角色层次结构。我在构建过程中不断遇到以下异常: 组织。springframework。豆。BeanInstationException:未能实例化[org.springframework.web.servlet.HandlerMapping]:工厂方法“defaultServletHandlerMapping”引发异常;嵌套的例外是java。lang.IllegalArg