我试图保护我的spring应用程序,它有不同的用户角色。虽然身份验证部分设置得很好,而且工作得很完美,但在授权部分的实现过程中,我意识到,通过某些注解,我的系统中的两个重写方法之一 SecurityConfiguration extends WebSecurityConfigurerAdapter class
,将被忽略。
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
private WebApplicationContext applicationContext;
private CredentialsService userDetailsService;
@Autowired
private DataSource dataSource;
@PostConstruct
public void completeSetup() {
userDetailsService = applicationContext.getBean(CredentialsService.class);
}
@Override
protected void configure(final HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/login")
.permitAll()
.and()
.formLogin()
.permitAll()
.and()
.httpBasic()
.disable()
.authorizeRequests()
.antMatchers("/admin", "/admin/**")
.hasRole("ADMIN")
.and()
.authorizeRequests()
.antMatchers("/employee", "/employee/**")
.hasRole("EMPLOYEE")
.and()
.authorizeRequests()
.antMatchers("/customer", "/customer/**")
.hasRole("CUSTOMER");
}
@Override
protected void configure(final AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService)
.passwordEncoder(encoder())
.and()
.authenticationProvider(authenticationProvider())
.jdbcAuthentication()
.dataSource(dataSource);
}
@Bean
public DaoAuthenticationProvider authenticationProvider() {
final DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
authProvider.setUserDetailsService(userDetailsService);
authProvider.setPasswordEncoder(encoder());
return authProvider;
}
@Bean
public PasswordEncoder encoder() {
return new BCryptPasswordEncoder(12);
}
}
现在的问题是,这个类对我的用户进行身份验证,但有一个主要缺点:
configure(final HttpSecurity http) throws Exception {
完全被忽略。
另一方面,如果我在类的顶部添加@configuration注解
protected void configure(final AuthenticationManagerBuilder auth) throws Exception {
完全忽略,因此将破坏授权,因为它将无法在我的自定义服务器上调用getusername()和getpassword UserDetailsService
实施。
如你所见,我用了 DaoAuthenticationProvider
示例作为authenticationprovider,因为我的应用程序从外部数据库检索用户/密码。
我现在采用的快速修复方法是在我的主类上添加以下方法
@EnableGlobalMethodSecurity(
securedEnabled = true,
jsr250Enabled = true,
prePostEnabled = true
)
以及 @Secured
我的受限控制器上的注解。这是可行的,但我想了解为什么spring有如此奇怪的行为,以及我可以采取什么措施来解决这些问题。
1条答案
按热度按时间2vuwiymt1#
由于要为用户分配角色,请使用以下语法
或
角色只存储为带有“role\”前缀的权限。
因此,角色“admin”等同于权限“role\ u admin”。
编辑1
您还可以简化配置,以明确所有内容的来源。
自从你
UserDetailsService
(CredentialsService
)已经是豆子了,春安会自动把它捡起来。