首页 > 解决方案 > Spring Security - 角色检查永久失败

问题描述

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

这是我的配置类:

@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(我公司的任务) - 如果这有什么关系吗?

标签: javaspringspring-security

解决方案


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

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


推荐阅读