pre*_*oid 23 spring spring-security spring-boot spring-java-config
我正在尝试在方法级别定义访问规则,但它无法正常工作.
SecurityConfiguration
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().
withUser("user").password("user").roles("USER").and().
withUser("admin").password("admin").roles("ADMIN");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
.antMatchers("/v2/**").authenticated()
.and()
.httpBasic()
.realmName("Secure api")
.and()
.csrf()
.disable();
}
}
Run Code Online (Sandbox Code Playgroud)
ExampleController
@EnableAutoConfiguration
@RestController
@RequestMapping({"/v2/"})
public class ExampleController {
@PreAuthorize("hasAuthority('ROLE_ADMIN')")
@RequestMapping(value = "/home", method = RequestMethod.GET)
String home() {
return "Hello World";
}
}
Run Code Online (Sandbox Code Playgroud)
每当我尝试访问/ v2/home使用user:user它执行得很好,它不应该给我一个访问被拒绝错误,因为'用户'没有ROLE_ADMIN?
我实际上是在考虑在方法级别放弃访问规则并坚持使用http()ant规则,但我必须知道它为什么不适合我.
小智 27
您必须添加@EnableGlobalMethodSecurity(prePostEnabled = true)WebSecurityConfig.
你可以在这里找到它:http://www.baeldung.com/spring-security-expressions-basic
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
Run Code Online (Sandbox Code Playgroud)
Ser*_*sta 24
在控制器上使用PrePost注释的一个常见问题是Spring方法安全性基于Spring AOP,默认情况下使用JDK代理实现.
这意味着它在服务层上工作正常,服务层作为接口注入控制器层,但在控制器层上被忽略,因为控制器通常不实现接口.
以下是我的意见:
sta*_*ail 15
将 @EnableGlobalMethodSecurity(prePostEnabled = true) 放入 MvcConfig 类(扩展 WebMvcConfigurerAdapter)而不是(扩展 WebSecurityConfigurerAdapter)。
像下面的例子:-
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MvcConfiguration extends WebMvcConfigurerAdapter {
Run Code Online (Sandbox Code Playgroud)
Jon*_*ker 11
对于 2023 年及以后来到这里的人,您必须将@EnableMethodSecurity注释添加到您的配置类中。还值得注意的是,自 2023 年起,Spring Boot 还使用自动配置。下面包含一个安全配置示例。
@Configuration
@EnableWebSecurity
@EnableMethodSecurity // Add this
public class SecurityConfig {
// Add your configuration Beans here
}
Run Code Online (Sandbox Code Playgroud)
你的控制器应该看起来像这样:
@RestController
@RequestMapping("/users")
public class UserController
{
// Replace this with your service or other means to fetch resources
private final UserRepository userRepository;
public UserController(UserRepository userRepository)
{
this.userRepository = userRepository;
}
// Note: I am using a scope called "users.read" below, but you can use
// ROLE_<role_name> if you are using roles instead.
@GetMapping(value = "/list")
@PreAuthorize("hasAuthority('users.read')")
public List<UserDto> listUsers()
{
return userRepository.findAllBy();
}
}
Run Code Online (Sandbox Code Playgroud)
小智 6
有两种不同的使用方式,一种是前缀,一种不是。你也许更改@PreAuthorize("hasAuthority('ROLE_ADMIN')")到@PreAuthorize("hasAuthority('ADMIN')")都会好的。
接下来是@PreAuthorize源代码。
private String defaultRolePrefix = "ROLE_";
public final boolean hasAuthority(String authority) {
return hasAnyAuthority(authority);
}
public final boolean hasAnyAuthority(String... authorities) {
return hasAnyAuthorityName(null, authorities);
}
public final boolean hasRole(String role) {
return hasAnyRole(role);
}
public final boolean hasAnyRole(String... roles) {
return hasAnyAuthorityName(defaultRolePrefix, roles);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
25488 次 |
| 最近记录: |