java中用security框架实现权限控制
时间: 2024-01-29 09:03:01 浏览: 29
Java中使用Security框架实现权限控制需要以下步骤:
1. 创建一个Security配置类,该类需要继承WebSecurityConfigurerAdapter类,并重写它的configure方法。
2. 在configure方法中配置HttpSecurity对象,设置需要保护的URL、访问该URL需要的权限等。
3. 实现UserDetailsService接口,该接口用于从数据库或其他数据源中获取用户信息,包括用户名、密码和角色等。
4. 在configure方法中调用authenticationManagerBean方法,将UserDetailsService对象传入,并使用PasswordEncoder对象加密密码。
5. 在控制器中使用@PreAuthorize注解,该注解可以在方法级别上实现权限控制,只有拥有相应角色的用户才能访问该方法。
示例代码如下:
```java
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/user/**").hasRole("USER")
.and()
.formLogin().loginPage("/login").permitAll()
.and()
.logout().permitAll()
.and().csrf().disable();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
```
```java
@Service
public class UserDetailsServiceImpl 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(username);
}
List<GrantedAuthority> authorities = new ArrayList<>();
for (Role role : user.getRoles()) {
authorities.add(new SimpleGrantedAuthority(role.getName()));
}
return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), authorities);
}
}
```
```java
@Controller
public class UserController {
@PreAuthorize("hasRole('USER')")
@GetMapping("/user")
public String user() {
return "user";
}
@PreAuthorize("hasRole('ADMIN')")
@GetMapping("/admin")
public String admin() {
return "admin";
}
}
```