介绍
必须在Java 8或者更高的环境。
SpringSecurity储存的密码都是加密后的,就算被泄漏黑客也不会知道原密码是什么。
Github示例:sample
配置
添加maven的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
配置访问url地址需要什么权限,没有权限失败的提示等
/**
* 1.Security配置好路径需要的权限,以及登录成功和登录失败的处理
* 2.当访问/login地址时,UsernamePasswordAuthenticationFilter会做如下操作
* 1.获取request里的username和password
* 2.将username传入LoginUserDetailsService查询帐号和密码
* 2.验证帐号和密码的结果,跳转成功或者失败的页面(默认跳转/index)
*/
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
/**
* 配置地址需要哪些权限
*/
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests(authorize -> authorize
.antMatchers("/css/**", "/index").permitAll()
.antMatchers("/user/**").hasRole("USER")
.antMatchers("/anonymous","/login").anonymous() //登录页面不需要权限
.antMatchers("/haveAuthority").hasAuthority("authority")
.anyRequest().authenticated()
).formLogin(formLogin -> formLogin
.loginPage("/login")
.failureUrl("/login-error")
.successForwardUrl("/haveAuthority")
).logout((logout) -> {
logout.invalidateHttpSession(true);
}).exceptionHandling(handler ->{
// 设置没有权限时跳转的地址,也可以实现去AuthenticationEntryPoint直接返回拒绝的结果
handler.accessDeniedPage("/deny");
});
}
/**
* 提供security框架在用户登录时候,从访问数据库获取用户信息的service
*/
@Bean
public UserDetailsService userDetailsService() {
return new LoginUserDetailsService();
}
}
使用
从数据库里获得用户的权限,之后spring security会根据用户的权限判断是否可以访问url
public class LoginUserDetailsService implements UserDetailsService {
/**
* 假装通过username去数据库里查询用户数据
*/
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
LoginUser loginUser = new LoginUser();
loginUser.setUserName(username);
loginUser.setPassword(PasswordEncoderFactories.createDelegatingPasswordEncoder().encode("password"));
// 添加权限
Set<GrantedAuthority> grantedAuthorities = new HashSet<>();
grantedAuthorities.add(() -> "authority");
loginUser.setAuthorities(grantedAuthorities);
return loginUser;
}
}