【发布时间】: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