当前位置: 首页 > news >正文

备案网站名称重复wordpress建站优缺点

备案网站名称重复,wordpress建站优缺点,万江建筑培训中心,河南省建设厅执业资格注册中心一、关于 SpringSecurity 在 Spring Boot 出现之前#xff0c;SpringSecurity 的使用场景是被另外一个安全管理框架 Shiro 牢牢霸占的#xff0c;因为相对于 SpringSecurity 来说#xff0c;SSM 中整合 Shiro 更加轻量级。Spring Boot 出现后#xff0c;使这一情况情况大有…一、关于 SpringSecurity 在 Spring Boot 出现之前SpringSecurity 的使用场景是被另外一个安全管理框架 Shiro 牢牢霸占的因为相对于 SpringSecurity 来说SSM 中整合 Shiro 更加轻量级。Spring Boot 出现后使这一情况情况大有改观。 这是因为 Spring Boot 为 SpringSecurity 提供了自动化配置大大降低了 SpringSecurity 的学习成本。另外SpringSecurity 的功能也比 Shiro 更加强大。 JWT目前最流行的一个跨域认证解决方案客户端发起用户登录请求服务器端接收并认证成功后生成一个 JSON 对象如下所示然后将其返回给客户端。 从本质上来说JWT 就像是一种生成加密用户身份信息的 Token更安全也更灵活。 三、整合步骤 第一步给需要登录认证的模块添加 codingmore-security 依赖 !-- 后端管理模块需要登录认证--dependencygroupIdtop.codingmore/groupIdartifactIdcodingmore-security/artifactIdversion1.0-SNAPSHOT/version 比如说 codingmore-admin 后端管理模块需要登录认证就在 codingmore-admin/pom.xml 文件中添加 codingmore-security 依赖。 第二步在需要登录认证的模块里添加 CodingmoreSecurityConfig 类继承自 codingmore-security 模块中的 SecurityConfig 类。 Configuration EnableWebSecurity EnableGlobalMethodSecurity(prePostEnabled true) public class CodingmoreSecurityConfig extends CustomSecurityConfig {Autowiredprivate IUsersService usersService;Autowiredprivate IResourceService resourceService;Beanpublic UserDetailsService userDetailsService() {//获取登录用户信息return username - usersService.loadUserByUsername(username);}UserDetailsService 这个类主要是用来加载用户信息的包括用户名、密码、权限、角色集合....其中有一个方法如下 UserDetails loadUserByUsername(String username) throws UsernameNotFoundException; 认证逻辑中SpringSecurity 会调用这个方法根据客户端传入的用户名加载该用户的详细信息包括判断 密码是否一致通过后获取权限和角色 public UserDetails loadUserByUsername(String username) {// 根据用户名查询用户Users admin getAdminByUsername(username);if (admin ! null) {ListResource resourceList getResourceList(admin.getId());return new AdminUserDetails(admin,resourceList);}throw new UsernameNotFoundException(用户名或密码错误);} getAdminByUsername 负责根据用户名从数据库中查询出密码、角色、权限等。 Overridepublic Users getAdminByUsername(String username) {// QueryWrapperUsers queryWrapper new QueryWrapper();//user_login为数据库字段// queryWrapper.eq(user_login, username);//ListUsers usersList baseMapper.selectList(queryWrapper);LambdaQueryWrapperUsers queryWrapper new LambdaQueryWrapper();queryWrapper.eq(Users::getUserLogin , username);ListUsers usersList baseMapper.selectList(queryWrapper);if (usersList ! null usersList.size() 0) {return usersList.get(0);}// 用户名错误提前抛出异常throw new UsernameNotFoundException(用户名错误);} 第三步在 application.yml 中配置下不需要安全保护的资源路径 secure:ignored:urls: #安全路径白名单- /doc.html- /swagger-ui/**- /swagger/**- /swagger-resources/**- /**/v3/api-docs- /**/*.js- /**/*.css- /**/*.png- /**/*.ico- /webjars/springfox-swagger-ui/**- /actuator/**- /druid/**- /users/login- /users/register- /users/info- /users/logout 第四步在登录接口中添加登录和刷新 token 的方法 Controller Api(tags 用户) RequestMapping(/users) public class UsersController {Autowiredprivate IUsersService usersService;Value(${jwt.tokenHeader})private String tokenHeader;Value(${jwt.tokenHead})private String tokenHead;ApiOperation(value 登录以后返回token)RequestMapping(value /login, method RequestMethod.POST)ResponseBodypublic ResultObject login(Validated UsersLoginParam users, BindingResult result) {String token usersService.login(users.getUserLogin(), users.getUserPass());if (token null) {return ResultObject.validateFailed(用户名或密码错误);}// 将 JWT 传递回客户端MapString, String tokenMap new HashMap();tokenMap.put(token, token);tokenMap.put(tokenHead, tokenHead);return ResultObject.success(tokenMap);}ApiOperation(value 刷新token)RequestMapping(value /refreshToken, method RequestMethod.GET)ResponseBodypublic ResultObject refreshToken(HttpServletRequest request) {String token request.getHeader(tokenHeader);String refreshToken usersService.refreshToken(token);if (refreshToken null) {return ResultObject.failed(token已经过期);}MapString, String tokenMap new HashMap();tokenMap.put(token, refreshToken);tokenMap.put(tokenHead, tokenHead);return ResultObject.success(tokenMap);} } 使用 Apipost 来测试一下首先是文章获取接口在没有登录的情况下会提示暂未登录或者 token 已过期。 四、实现原理 仅用四步就实现了登录认证主要是因为将 SpringSecurityJWT 的代码封装成了通用模块我们来看看 codingmore-security 的目录结构。 codingmore-security ├── component | ├── JwtAuthenticationTokenFilter -- JWT登录授权过滤器 | ├── RestAuthenticationEntryPoint | └── RestfulAccessDeniedHandler ├── config | ├── IgnoreUrlsConfig | └── SecurityConfig └── util└── JwtTokenUtil -- JWT的token处理工具类 JwtAuthenticationTokenFilter 和 JwtTokenUtil 补充一下 客户端的请求头里携带了 token服务端肯定是需要针对每次请求解析校验 token 的所以必须得定义一个过滤器也就是 JwtAuthenticationTokenFilter 从请求头中获取 token对 token 进行解析、验签、校验过期时间校验成功将验证结果放到 ThreadLocal 中供下次请求使用 重点来看其他四个类。第一个 RestAuthenticationEntryPoint自定义返回结果未登录或登录过期 public class RestAuthenticationEntryPoint implements AuthenticationEntryPoint {Overridepublic void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {response.setHeader(Access-Control-Allow-Origin, *);response.setHeader(Cache-Control,no-cache);response.setCharacterEncoding(UTF-8);response.setContentType(application/json);response.getWriter().println(JSONUtil.parse(ResultObject.unauthorized(authException.getMessage())));response.getWriter().flush();} } 可以通过 debug 的方式看一下返回的信息正是之前用户未登录状态下访问文章页的错误信息。 具体的信息是在 ResultCode 类中定义的。 public enum ResultCode implements IErrorCode {SUCCESS(0, 操作成功),FAILED(500, 操作失败),VALIDATE_FAILED(506, 参数检验失败),UNAUTHORIZED(401, 暂未登录或token已经过期),FORBIDDEN(403, 没有相关权限);private long code;private String message;private ResultCode(long code, String message) {this.code code;this.message message;} } 第二个 RestfulAccessDeniedHandler自定义返回结果没有权限访问时 public class RestfulAccessDeniedHandler implements AccessDeniedHandler{Overridepublic void handle(HttpServletRequest request,HttpServletResponse response,AccessDeniedException e) throws IOException, ServletException {response.setHeader(Access-Control-Allow-Origin, *);response.setHeader(Cache-Control,no-cache);response.setCharacterEncoding(UTF-8);response.setContentType(application/json);response.getWriter().println(JSONUtil.parse(ResultObject.forbidden(e.getMessage())));response.getWriter().flush();} } 第三个IgnoreUrlsConfig用于配置不需要安全保护的资源路径 Getter Setter ConfigurationProperties(prefix secure.ignored) public class IgnoreUrlsConfig {private ListString urls new ArrayList(); } 通过 lombok 注解的方式直接将配置文件中不需要权限校验的路径放开比如说 Knife4j 的接口文档页面。如果不放开的话就被 SpringSecurity 拦截了没办法访问到了。 第四个SecurityConfigSpringSecurity通用配置 public class SecurityConfig extends WebSecurityConfigurerAdapter {Autowired(required false)private DynamicSecurityService dynamicSecurityService;Overrideprotected void configure(HttpSecurity httpSecurity) throws Exception {ExpressionUrlAuthorizationConfigurerHttpSecurity.ExpressionInterceptUrlRegistry registry httpSecurity.authorizeRequests();//不需要保护的资源路径允许访问for (String url : ignoreUrlsConfig().getUrls()) {registry.antMatchers(url).permitAll();}// 任何请求需要身份认证registry.and().authorizeRequests().anyRequest().authenticated()// 关闭跨站请求防护及不使用session.and().csrf().disable().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)// 自定义权限拒绝处理类.and().exceptionHandling().accessDeniedHandler(restfulAccessDeniedHandler()).authenticationEntryPoint(restAuthenticationEntryPoint())// 自定义权限拦截器JWT过滤器.and().addFilterBefore(jwtAuthenticationTokenFilter(), UsernamePasswordAuthenticationFilter.class);//有动态权限配置时添加动态权限校验过滤器if(dynamicSecurityService!null){registry.and().addFilterBefore(dynamicSecurityFilter(), FilterSecurityInterceptor.class);}} } 这个类的主要作用就是告诉 SpringSecurity 那些路径不需要拦截除此之外的都要进行 RestfulAccessDeniedHandler登录校验、RestAuthenticationEntryPoint权限校验和 JwtAuthenticationTokenFilterJWT 过滤。 并且将 JwtAuthenticationTokenFilter 过滤器添加到 UsernamePasswordAuthenticationFilter 过滤器之前。 五、测试 第一步测试登录接口Apipost 直接访问 http://localhost:9002/users/login可以看到 token 正常返回。 第二步不带 token 直接访问文章接口可以看到进入了 RestAuthenticationEntryPoint 这个处理器 第三步携带 token这次我们改用 Knife4j 来测试发现可以正常访问
http://www.w-s-a.com/news/57036/

相关文章:

  • 网站推广效果怎么样建设工程公司组织架构图
  • 成都制作网站价格表网站安全证书过期怎么办
  • 高校图书馆网站的建设方案湖南常德市
  • 房地产怎么做网站推广wordpress插件汉化下载
  • 一般pr做视频过程那个网站有无锡网络公司平台
  • 安徽网站推广系统网站根目录权限设置
  • 班级网站建设需求智慧校园登录入口
  • asp.net网站发布到虚拟主机电商设计网站哪个好
  • 做的网站怎么转成网址链接企业为什么要找会计
  • 关于建设网站的情况说明书文化建设方面的建议
  • 订票网站开发公司大通证券手机版下载官方网站下载
  • 网店美工的意义与发展佛山推广seo排名
  • 网站在建设中模板自助云商城
  • 珠海网站设计建建建设网站公司网站
  • 广州高端网站制作公司哪家好网页制作公司 软件
  • 最快做网站的语言百度站长反馈
  • 简单网站设计价格手机网站技巧
  • 什么颜色做网站显的大气网站建设的含盖哪方面
  • 没网站怎么做二维码扫描连接济南做网站推广哪家好
  • 台州建设规划局网站搞外贸一般是干什么的
  • 怎么提高自己网站的知名度电子商务是建网站
  • 官方查企业的网站办公用品网站建设策划书
  • 微信网站搭建哪家好网站中转页
  • 阿里巴巴网站开发是谁长沙自助模板建站
  • 阿里云网站方案建设书网络公司运营是干啥的
  • 南通seo网站排名优化nginx wordpress rewrite
  • 网站做成软件做内部网站费用
  • 浙江企业网站建设网站域名有了 网站如何建设
  • 学编程哪个机构有权威德州做网站优化
  • 最火的网站开发语言福州网站建设服务商