使用spring security实现自定义接口认证
时间: 2023-07-07 12:05:28 浏览: 125
使用 Spring Security 实现自定义接口认证一般需要以下步骤:
1. 创建一个实现了 `UserDetailsService` 接口的类,用于从数据库中获取用户信息。
2. 实现一个 `PasswordEncoder` 接口的类,用于对用户密码进行加密和解密。
3. 配置 `WebSecurityConfigurerAdapter` 类,用于配置 Spring Security 的相关设置,如登录页面、登录成功后的跳转页面等。
4. 在 `WebSecurityConfigurerAdapter` 中使用 `AuthenticationManagerBuilder` 配置认证管理器,将自定义的 `UserDetailsService` 和 `PasswordEncoder` 注入其中,以实现对用户信息的认证和密码加密解密。
5. 在控制器中使用 `@PreAuthorize` 注解对需要认证的接口进行权限控制。
下面是一个简单的示例代码:
```java
@Service
public class UserService implements UserDetailsService {
@Autowired
private UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = userRepository.findByUsername(username);
if (user == null) {
throw new UsernameNotFoundException("User not found");
}
return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(),
AuthorityUtils.createAuthorityList(user.getRoles()));
}
}
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserService userService;
@Autowired
private PasswordEncoder passwordEncoder;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().antMatchers("/api/**").authenticated().and().formLogin();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userService).passwordEncoder(passwordEncoder);
}
}
@RestController
@RequestMapping("/api")
public class ApiController {
@GetMapping("/hello")
@PreAuthorize("hasRole('USER')")
public String hello() {
return "Hello, world!";
}
}
```
在上面的示例代码中,`UserService` 实现了 `UserDetailsService` 接口,并通过注入 `UserRepository` 实现了从数据库中获取用户信息的功能。`WebSecurityConfig` 继承了 `WebSecurityConfigurerAdapter`,并使用 `AuthenticationManagerBuilder` 配置了认证管理器,将自定义的 `UserDetailsService` 和 `PasswordEncoder` 注入其中。
在 `ApiController` 中,使用了 `@PreAuthorize` 注解对需要认证的 `/api/hello` 接口进行了权限控制,只有拥有 `USER` 角色的用户才能访问该接口。
阅读全文