SpringSecurity
Spring Security简介
解决的两个核心问题:认证和授权
默认存在IOC AOP
基于配置(配置类中配置权限基本操作)
SpringSecurity自定义登录
1.API对象
UserDetailsService:loadUserByUserName
UserDetails(登录用户信息):用户名、密码、权限
PasswordEncoder:encode、matches
2.自定义登录前后端
- 后端:
1.实现UserDetailsService接口:需要自定义逻辑时,需要实现 UserDetailsService 接口
2.PasswordEncoder 密码解析器,其中BCryptPasswordEncoder 是 Spring Security 官方推荐的密码解析器
自定义表单配置。
- 自定义表单配置:
1.SecurityConfig 配置类 继承 WebSecurityConfigureAdaptor 重写configure(http)
2.configure 方法中加入自定义表单配置
- 其他配置
1.自定义登录表单参数:usernameParameters()、passwordParameter()【form表单name 与自定义表单参数名一致】
2.error.html
3.访问URL匹配
配置类中http.authorizeRequests() 主要是对url进行控制,也就是我们所说的授权(访问控制)。http.authorizeRequests() 也支持连缀写法
anyRequest():表示匹配所有的请求
antMatcher():参数是不定向参数,每个参数是一个 ant 表达式,用于匹配URL规则。
regexMatchers():使用正则表达式进行匹配。
mvcMatchers():适用于配置了 servletPath 的情况
4.内置访问控制方法
Spring Security 匹配了 URL 后调用了 permitAll() 表示不需要认证,随意访问。在 Spring
Security 中提供了多种内置控制。
.antMatchers("/yjxxt/demo").permitAll()
这里是引用permitAll()表示所匹配的 URL 任何人都允许访问。
authenticated()表示所匹配的 URL 都需要被认证才能访问。
anonymous()表示可以匿名访问匹配的URL。和permitAll()效果类似,只是设置为anonymous()的 url 会执行 filter 链中
denyAll()表示所匹配的 URL 都不允许被访问。
被“remember me”的用户允许访问
如果用户不是被 remember me 的,才可以访问
5.角色权限判断
其他的权限控制
.antMatchers("/main1.html").hasAuthority("admin")
hasAuthority(String)判断用户是否具有特定的权限
hasAnyAuthority(String …)如果用户具备给定权限中某一个,就允许访问。
hasRole(String)如果用户具备给定角色就允许访问。否则出现 403。
hasAnyRole(String …)如果用户具备给定角色的任意一个,就允许被访问
hasIpAddress(String)如果请求是指定的 IP 就运行访问。
6.403 没有权限处理(实现AccessDenyHandler 接口)
其他SpringSecurity知识
1.基于表达式的访问控制
access()方法使用:可以通过 access() 实现和之前学习的权限控制完成相同的功能。可以使用自定义方法。
2.基于注解的访问控制
在 Spring Security 中提供了一些访问控制的注解。这些注解都是默认是都不可用的,需要通过
@EnableGlobalMethodSecurity 进行开启后使用。
- @Secured 是专门用于判断是否具有角色的。能写在方法或类上。参数要以 ROLE_开头。
- @PreAuthorize/@PostAuthorize:在执行前后判断权限
3.RememberMe功能实现
Spring Security 中 Remember Me 为“记住我”功能,用户只需要在登录时添加 rememberme复选框,取值为true。Spring Security 会自动把用户信息存储到数据源中,以后就可以不登录进行访问
4.Thymeleaf中SpringSecurity的使用(视图技术)
5.退出登录
6.SpringSecurity中的CSRF
CSRF(Cross-site request forgery)跨站请求伪造,也被称为“OneClick Attack” 或者Session Riding。通过伪造用户请求访问受信任站点的非法请求访问。
从 Spring Security4开始CSRF防护默认开启。默认会拦截请求。进行CSRF处理。CSRF为了保
证不是其他第三方网站访问,要求访问时携带参数名为 _csrf 值为token(token 在服务端产生)
的内容,如果token和服务端的token匹配成功,则正常访问。