当前位置: 首页 > 知识库问答 >
问题:

Springboot安全角色不工作

郝君博
2023-03-14

我无法在@PreAuthorize注释中使用hasRole方法。还有请求。iUserInRole(“ADMIN”)给出false。我错过了什么?尽管。hasAuthority(“ADMIN”)工作正常。

我正在从数据库中为用户分配权限。

共有3个答案

叶书
2023-03-14

我不得不即兴发挥一点,也许还有其他比我更简单的方法,但是在我从事这项工作的时候,我别无选择,只能即兴发挥一点,经过彻底的研究,我想出了这个解决方案。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。

赫连骏
2023-03-14

您可以使用hasRole()hasAuthority()。区别在于,对于hasosthority()方法,您必须使用ROLE

所以对于角色_ADMIN

java prettyprint-override"> @PreAuthorize("hasRole('ADMIN')") == @PreAuthorize("hasAuthority('ROLE_ADMIN')")
山疏珂
2023-03-14

您必须使用前缀角色命名您的权限,才能使用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