【问题标题】:Spring Security - Role check fails permanently [duplicate]Spring Security - 角色检查永久失败[重复]
【发布时间】:2021-11-19 22:44:58
【问题描述】:

我正在尝试学习 Spring Security 并希望保护 API。我一方面想要一个带有数据库身份验证的登录表单,另一方面想要一个 OAuth2 身份验证。 但我被困在第一个任务上。问题是应用程序不接受我的角色,我不知道为什么。

这是我的 Config 类:

@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

@Autowired
DataSource dataSource;

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.jdbcAuthentication()
            .dataSource(dataSource)
            .usersByUsernameQuery("SELECT username,password,enabled FROM users WHERE username=?")
            .authoritiesByUsernameQuery("SELECT username, authority FROM authorities WHERE username=?");
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
            .antMatchers("/createTrack").hasRole("CREATOR")
            .antMatchers("/getTrack").hasAnyRole("CREATOR", "USER")
            .antMatchers("/test").hasRole("CREATOR")
            .antMatchers("/all").permitAll()
            .and().formLogin();
}

@Bean
public PasswordEncoder getPasswordEncoder() {
    // TODO: Change this to hashed password (this is for demo purposes)
    return NoOpPasswordEncoder.getInstance();
}
}

一切都像 Spring 文档中描述的那样:https://docs.spring.io/spring-security/site/docs/current/reference/html5/#servlet-authentication-jdbc

我设计了几个 API 端点来测试登录用户的名称和角色。一切正常 - 登录似乎很好,角色也正确。

但是当我尝试调用一个只能由一个或两个特定角色访问的端点时,它会得到一个 403 错误响应。

我做错了什么?试了很多,还是不行。

谢谢!

PS:我正在使用 MyBatis(我公司的任务) - 如果这有任何影响?

【问题讨论】:

  • 嘿 Toerktumlare,谢谢你,你给我带来了解决方案! CORS 不是问题,但我启用了调试,发现 Spring 正在数据库中寻找前缀为“ROLE_”的角色。由于我的角色存储为“CREATOR”和“USER”,因此无法找到它们。我只是想知道这种行为是否可以配置?这样角色的名字就可以不带前缀,例如...?
  • 首先,不要在 cmets 中提出新问题,stackoverflow 不是一个论坛,它是一个问答网站,是不得已而为之。询问堆栈溢出会占用某人的时间,不应轻易完成。其次,您是否阅读了 spring 安全参考文档,并阅读了您的问题,即为什么要为角色添加前缀,以及如何完成以及如何配置它?如果不是,我总是建议你这样做。您不会问堆栈溢出如何启用调试日志记录。
  • 谢谢。我是stackoverflow的新手,因此我对这里的最佳实践不太熟悉。那么一切都清楚了。再次感谢。

标签: java spring spring-security


【解决方案1】:

谢谢大家的帮助! Toerktumlare 的回答让我找到了解决方案。我按照您的建议打开了调试日志记录。 CORS 不是问题,但阅读调试消息让我走上了正确的道路。

虽然问题很小。我将数据库中的角色存储为“CREATOR”或“USER”。调试消息显示 Spring 正在寻找“ROLE_CREATOR”或“ROLE_USER”,并且 - 因为我的角色没有以这种方式保存 - 没有找到它们。因此我得到了 403 HTTP 响应。

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 2021-12-21
  • 1970-01-01
  • 1970-01-01
  • 2011-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 2013-02-04
相关资源
最近更新 更多