1. 配置安全上下文:
- 创建一个配置类继承
WebSecurityConfigurerAdapter
。 - 使用
@EnableWebSecurity
或@EnableGlobalMethodSecurity
注解来启用Spring Security的Web安全特性和方法级别的安全性。 - 在配置类中重写
configure(HttpSecurity http)
方法来设置URL访问规则。@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/admin/**").hasRole("ADMIN") .antMatchers("/user/**").hasRole("USER") .antMatchers("/", "/home", "/register").permitAll() .anyRequest().authenticated() .and() .formLogin() .and() .httpBasic(); } }
2. 定义认证管理器(AuthenticationManager):
- 实现自定义的
UserDetailsService
来加载用户的权限和角色信息。 - 配置密码编码器(如BCryptPasswordEncoder)以确保存储的密码安全性。
- 在
WebSecurityConfigurerAdapter
的configure(AuthenticationManagerBuilder auth)
方法中配置认证提供者。 -
@Configuration public class MySecurityUserConfig { @Bean public UserDetailsService userDetailService() { // 使用org.springframework.security.core.userdetails.User类来定义用户 //定义两个用户 UserDetails user1 = User.builder() .username("eric") .password(passwordEncoder().encode("123456")) .roles("student") .build(); UserDetails user2 = User.builder() .username("thomas") .password(passwordEncoder().encode("123456")) .roles("teacher") .build(); //创建两个用户 InMemoryUserDetailsManager userDetailsManager = new InMemoryUserDetailsManager(); userDetailsManager.createUser(user1); userDetailsManager.createUser(user2); return userDetailsManager; } @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailService()).passwordEncoder(passwordEncoder()); } /* * 从 Spring5 开始,强制要求密码要加密 * @return */ @Bean public PasswordEncoder passwordEncoder(){ //使用加密算法对密码进行加密 return new BCryptPasswordEncoder(); } }
3. 使用注解保护方法和配置角色/权限:
- 使用
@PreAuthorize
、@PostAuthorize
、@Secured
等注解在方法级别上控制访问权限。 - 这些注解可以基于角色、权限或SpEL表达式来限制方法的访问。
-
@PreAuthorize("hasAuthority('teacher:add')") public void addMethod() { // 方法内容 }