springSecurity注解使用
时间: 2023-12-10 21:29:23 浏览: 82
Spring Security 是一个基于 Spring 框架的安全框架,可以轻松地实现身份认证和授权等安全功能。
Spring Security 提供了一些注解,用于在应用中标注安全相关的信息,例如:
- @Secured:用于标注方法或类,表示该方法或类需要特定的权限才能被访问。
- @PreAuthorize:用于标注方法或类,表示该方法或类需要满足指定的条件才能被访问。
- @PostAuthorize:用于标注方法,表示该方法需要在执行后满足指定的条件才能返回结果。
- @RolesAllowed:用于标注方法或类,表示该方法或类需要特定的角色才能被访问。
- @AuthenticationPrincipal:用于标注方法的参数,表示该参数需要获取当前身份认证用户的信息。
使用这些注解可以非常方便地实现应用的安全控制,例如:
```java
@RestController
public class UserController {
@Autowired
private UserService userService;
@Secured("ROLE_ADMIN")
@GetMapping("/users")
public List<User> getUsers() {
return userService.getUsers();
}
@PreAuthorize("hasRole('ADMIN') or hasRole('USER')")
@GetMapping("/users/{id}")
public User getUserById(@PathVariable("id") Long id) {
return userService.getUserById(id);
}
@PostAuthorize("returnObject.username == authentication.principal.username")
@PutMapping("/users/{id}")
public User updateUser(@PathVariable("id") Long id, @RequestBody User user) {
return userService.updateUser(id, user);
}
@RolesAllowed({"ADMIN", "USER"})
@DeleteMapping("/users/{id}")
public void deleteUser(@PathVariable("id") Long id) {
userService.deleteUser(id);
}
@GetMapping("/me")
public User getMe(@AuthenticationPrincipal UserDetails userDetails) {
return userService.getUserByUsername(userDetails.getUsername());
}
}
```
在上述代码中,我们使用了 Spring Security 提供的各种注解,实现了对用户资源的安全控制。例如:
- getUsers 方法需要 ROLE_ADMIN 权限才能访问。
- getUserById 方法需要 ADMIN 或 USER 角色才能访问。
- updateUser 方法执行后需要满足返回对象的 username 属性等于当前用户的用户名。
- deleteUser 方法需要 ADMIN 或 USER 角色才能访问。
- getMe 方法获取当前用户的信息,使用了 @AuthenticationPrincipal 注解获取了当前身份认证用户的信息。
需要注意的是,使用注解时需要启用 Spring Security 的方法级别安全控制,即需要在 WebSecurityConfigurerAdapter 中配置如下内容:
```java
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest().authenticated() // 其他所有请求均需要身份认证
.and()
.httpBasic(); // 使用 HTTP Basic 认证方式
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
// 配置用户信息和密码编码器
auth.inMemoryAuthentication()
.withUser("admin").password(passwordEncoder().encode("admin")).roles("ADMIN")
.and()
.withUser("user").password(passwordEncoder().encode("user")).roles("USER");
}
@Bean
public PasswordEncoder passwordEncoder() {
// 选择密码编码器
return new BCryptPasswordEncoder();
}
}
```
在上述代码中,我们配置了使用 HTTP Basic 认证方式,配置了用户信息和密码编码器,启用了方法级别安全控制。这样,我们就可以使用注解来实现应用的安全控制了。
阅读全文