连云港规划建设网站,深圳招聘官网,东莞市建设局质量监督网站,北京西路做网站的公司改文章写的很好#xff1a;https://zhuanlan.zhihu.com/p/342755411
Spring security 分为两个部分
登陆认证权限认证
登陆认证 其实就是就是登陆注册#xff0c;然后获取登陆凭证的问题 操作如下
登陆账号密码#xff0c;通过账号查询出用户数据#xff0c;然后密码进…改文章写的很好https://zhuanlan.zhihu.com/p/342755411
Spring security 分为两个部分
登陆认证权限认证
登陆认证 其实就是就是登陆注册然后获取登陆凭证的问题 操作如下
登陆账号密码通过账号查询出用户数据然后密码进行比对比对成功将用户信息插入 SecurityContextHolder 中 这就是过了登陆认证。也就是说 UsernamePasswordAuthenticationFilter 拦截器将不在拦截
AutoConfiguration
// 需要配置权限认证的其实就只有这一段添加这个注解就OK了
// 就是这个 prePostEnabledtrue有了它就可以在方法上写注解来做权限验证
// 例如PreAuthorize(实例类.方法(参数))
// examplePreAuthorize(ss.hasPermission(true))
// 具体看下面的权限验证部分
EnableGlobalMethodSecurity(prePostEnabled true, securedEnabled true)
public class YudaoWebSecurityConfigurerAdapter {
... 省略其他代码/*** 配置 URL 的安全配置* * 注意* 其实这里主要是设置是否需要登录的* 权限验证其实不在这个地方** anyRequest | 匹配所有请求路径* access | SpringEl表达式结果为true时可以访问* anonymous | 匿名可以访问* denyAll | 用户不能访问* fullyAuthenticated | 用户完全认证可以访问非remember-me下自动登录* hasAnyAuthority | 如果有参数参数表示权限则其中任何一个权限可以访问* hasAnyRole | 如果有参数参数表示角色则其中任何一个角色可以访问* hasAuthority | 如果有参数参数表示权限则其权限可以访问* hasIpAddress | 如果有参数参数表示IP地址如果用户IP和参数匹配则可以访问* hasRole | 如果有参数参数表示角色则其角色可以访问* permitAll | 用户可以任意访问* rememberMe | 允许通过remember-me登录的用户访问* authenticated | 用户登录后可访问*/Beanprotected SecurityFilterChain configure(HttpSecurity httpSecurity) throws Exception {// 设置每个请求的权限httpSecurity// ①全局共享规则.authorizeRequests()// permitAll 关键点 这里就是意思要不要登陆.antMatchers(securityProperties.getPermitAllUrls().toArray(new String[0])).permitAll()// ③兜底规则必须认证.anyRequest().authenticated();// 添加 JWT FilterhttpSecurity.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);return httpSecurity.build();}
... 省略其他代码权限验证
AutoConfiguration
EnableConfigurationProperties(SecurityProperties.class)
public class YudaoSecurityAutoConfiguration {Resourceprivate SecurityProperties securityProperties;/*** Spring Security 加密器* 考虑到安全性这里采用 BCryptPasswordEncoder 加密器** see a hrefhttp://stackabuse.com/password-encoding-with-spring-security/Password Encoding with Spring Security/a*/Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}/*** 认证失败处理类 Bean*/Beanpublic AuthenticationEntryPoint authenticationEntryPoint() {return new AuthenticationEntryPointImpl();}/*** 权限不够处理器 Bean*/Beanpublic AccessDeniedHandler accessDeniedHandler() {return new AccessDeniedHandlerImpl();}/*** Token 认证过滤器 Bean*/Beanpublic TokenAuthenticationFilter authenticationTokenFilter(GlobalExceptionHandler globalExceptionHandler) {return new TokenAuthenticationFilter(securityProperties, globalExceptionHandler);}Bean(ss) // 使用 Spring Security 的缩写方便使用public SecurityFrameworkService securityFrameworkService() {return new SecurityFrameworkServiceImpl();}}权限验证
上面配置已经开启了注解 PreAuthorize 来做权限验证 看懂这里就简单了。举例如下 例如PreAuthorize(“实例类.方法(‘参数’)”) examplePreAuthorize(“ss.hasPermission(‘true’)”) 这里实现就是
开启注解PreAuthorize做权限校验注入名称为 ss 的bean写入方法 hasPermission方法返回true权限校验通过false权限校验不通过
注入名称为 ss 的bean 如下
// 创建一个权限校验类
AllArgsConstructor
public class SecurityFrameworkServiceImpl {Overridepublic boolean hasPermission(String permission) {return permission.equals(true);}Overridepublic boolean hasAnyPermissions(String... permissions) {return false;}Overridepublic boolean hasRole(String role) {return false;}Overridepublic boolean hasAnyRoles(String... roles) {return false;}Overridepublic boolean hasScope(String scope) {return false;}Overridepublic boolean hasAnyScopes(String... scope) {return false;}
}// 实例化 权限校验类并注入spring容器中
Bean(ss)
public SecurityFrameworkService securityFrameworkService() {return new SecurityFrameworkServiceImpl();
}到这里就结束了! PreAuthorize(“ss.hasPermission(‘true’)”) PreAuthorize 开启校验 调用ss实例类中的hasPermission方法 返回结果为true权限通过false权限不通过