代码实现
前端 login.html 代码:
<form action="/user/login" method="post">
用户名:<input type="text" name="username">
</br>
密码:<input type="password" name="password">
</br>
<input type="checkbox" name="remember-me"/>自动登录
<input type="submit" value="login"/>
</form>
注意:checkbox的name属性必须是 remember-me
配置类的代码
@Configuration
public class SecurityConfigTest extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
//注入数据源
@Autowired
private DataSource dataSource;
//配置对象
@Bean
public PersistentTokenRepository persistentTokenRepository(){
JdbcTokenRepositoryImpl jdbcTokenRepository=new JdbcTokenRepositoryImpl();
jdbcTokenRepository.setDataSource(dataSource);
//自动创建表格
jdbcTokenRepository.setCreateTableOnStartup(true);
return jdbcTokenRepository;
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(password());
}
@Bean
PasswordEncoder password(){
return new BCryptPasswordEncoder();
}
protected void configure(HttpSecurity http) throws Exception{
//退出
http.logout().logoutUrl("/logout").logoutSuccessUrl("/test/hello").permitAll();
//配置没有访问权限访问跳转自定义页面
http.exceptionHandling().accessDeniedPage("/unanth.html");
http.formLogin() //自定义自己编写的登录页面
.loginPage("/login.html") //登录页面设置
.loginProcessingUrl("/user/login") //登录访问路径
.defaultSuccessUrl("/success.html").permitAll() //登录成功之后,跳转路径
.and().authorizeRequests()
.antMatchers("/","/test/hello","/user/login").permitAll() //设置哪些路径可以直接访问,不需要认证
//当前登录用户,只有具有admins权限才可以访问这个路径
//hasAuthority方法
//.antMatchers("/test/index").hasAuthority("admins")
//hasAnyAuthority方法(有问题)
//.antMatchers("/test/index").hasAnyAuthority("admins,manager")
.anyRequest().authenticated()
//自动登录
.and().rememberMe().tokenRepository(persistentTokenRepository())
.tokenValiditySeconds(60)//设置有效时长,单位秒
.userDetailsService(userDetailsService)
.and().csrf().disable(); //关闭csrf的防护
}
}
以上两张图是自动配置相关的配置代码