一、用户存储方式:
1、基于内存的用户存储
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
/**
* 1.通过调用inMemoryAuthentication()启用内存用户存储
* 对于调试和开发人员测试来说,基于内存的用户存储很有用
*/
auth.inMemoryAuthentication()
.withUser("user").password("password").roles("USER").and()
.withUser("admin").password("password").roles("USER", "ADMIN");
}
2、基于数据库表进行认证
@Autowired
private DataSource dataSource;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//1.默认的最少配置要求数据库预存储某些表
auth.jdbcAuthentication().dataSource(dataSource);
//2.自定义查询
auth.jdbcAuthentication().dataSource(dataSource)
.usersByUsernameQuery("select username,password,true from siapp_user where username = ?")
.authoritiesByUsernameQuery("select username,'ROLE_USER' from siapp_user where username = ?")
.passwordEncoder(new StandardPasswordEncoder("123456"));
}
3、基于LDAP进行认证
方法userSearchFilter()和groupSearchFilter()用来为基础LDAP查询提供过滤条件,它们分别用于搜索用户和组,默认情况下,对于用户和组的基础查询都是空的,也就是表明搜索会在LDAP层级结构的根开始。但是我们可以通过指定查询基础来改变这个默认行为:
1)LDAP认证策略
a.默认 进行绑定操作,直接通过LDAP服务器认证用户
b.进行比对操作。将输入的密码发送到LDAP目录上,并要求服务器将这个密码和用户的密码进行比,声明passwordCompare()方法来实现
2)引用远程的LDAP服务器
如果你的LDAP服务器在另一台机器上,那么可以使用contextSource()方法来配置这个地址
3)配置嵌入式的LDAP服务器
通过root()方法指定嵌入式服务器的根前缀
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.ldapAuthentication()
.userSearchBase("ou=people")
.userSearchFilter("(uid={0})")
.groupSearchBase("ou=groups")
.groupSearchFilter("member={0}")
.passwordCompare()
.passwordAttribute("passcode");// passwordAttribute() 声明密码属性的名称
// .contextSource()
// .url("http://www.baidu.com")
// .contextSource()
// .root("dc=habuma,dc=com")
}
4.配置自定义的用户服务
实现UserDetailsServic接口,重写loadUserByUsername()方法,根据给定的用户名来查找用户
二、拦截请求
authenticated() 要求在执行请求时,必须时用户已登录
permitAll() 允许的请求 没有任何安全限制
hasRole()限制某个特定的角色
默认配置 要求进入应用的所有http请求都要进行认证,也配置了Spring Security支持基于表单的登录和Http Basic方式的认证
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().anyRequest().authenticated()
.and().formLogin()
.and().httpBasic();
}
1、使用spring表达式进行安全访问
2、强制通道的安全性
.requiresChannel().antMatchers().requiresSecure() //需要HTTPS
3、防止跨站请求伪造(CSRF)
Spring Security通过一个同步token的方式来实现CSRF防护的功能。它将会拦截状态变化的请求(例如,非GET、HEAD、OPTIONS和TRACE的请求)并检查CSRF token。如果请求中不包含CSRF token的话,或者token不能与服务器端的token相
匹配,请求将会失败,并抛出CsrfException异常
注意:禁用CSRF防护功能通常来讲并不是一个好主意
四、认证用户
1.formLogin() 启用基本的登录页功能
2.httpBasic() 启用HTTP Basic认证
3.rememberMe()启用Remember-me功能
默认在cookie中存储一个token,最多两周有效
4.退出
用户退出应用,所有的Remember-me token都会被清除掉。在退出完成后,用户浏览器将会重定向到“/login?logout”,从而允许用户进行再次登录。如果你希望用户被重定向到其他的页面,如应用的首页,可通过logoutSuccessUrl()进行设置