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

as3.0网站制作教程深圳网络络推广培训

as3.0网站制作教程,深圳网络络推广培训,做网站一个月可以赚多少钱,电商创业怎么做前言 之前写的 涂涂影院管理系统 这个 demo 是基于 shiro 来鉴权的#xff0c;项目前后端分离后#xff0c;显然集成 Spring Security 更加方便一些#xff0c;毕竟#xff0c;都用 Spring 了#xff0c;权限管理当然 Spring Security. 花了半天时间整理的笔记#xff0…前言 之前写的 涂涂影院管理系统 这个 demo 是基于 shiro 来鉴权的项目前后端分离后显然集成 Spring Security 更加方便一些毕竟都用 Spring 了权限管理当然 Spring Security. 花了半天时间整理的笔记希望能对你有所帮助。 Spring Security 一句话概述一组 filter 过滤器链组成的权限认证。 一、加入依赖 环境项目采用 Spring Initializr 快速构建 Spring Boot 版本交由 spring-boot-starter-parent 管理。 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-security/artifactId /dependency在仅仅添加完依赖的情况下启动项目看看 1.1 控制台打印 控制台打印了一串密码如下图所示 访问一下项目中的某个方法 http://localhost:7777/tmax/videoCategory/getAll奇怪怎么自己跳到 /login 路径下了而且还让登陆 1.2 账号登录 在登陆 from 表单里输入如下 用户名user密码0839a4ba-c8a3-4aee-8a6e-cd19c1d0b0c1控制台打印的 点击 Sign in 然后跳转到了目标地址 添加 Spring Security 依赖后实际触发了两件事一时将系统中所有的连接服务都保护起来 再就是会有默认配置 form 表单认证。 二、基本原理 Spring Security的整个工作流程如下所示 绿色认证方式可以配置 橘黄色和蓝色的位置不可更改。 Security 有两种认证方式 httpbasicformLogin 默认的如上边那种方式 同样Security 也提供两种过滤器类 UsernamePasswordAuthenticationFilter 表示表单登陆过滤器BasicAuthenticationFilter 表示 httpbaic 方式登陆过滤器 图中橙色的 FilterSecurityInterceptor 是最终的过滤器它会决定当前的请求可不可以访问Controller判断规则放在这个里面。 当不通过时会把异常抛给在这个过滤器的前面的 ExceptionTranslationFilter 过滤器。 ExceptionTranslationFilter 接收到异常信息时将跳转页面引导用户进行认证如上方所示的用户登陆界面。 三、自定义认证逻辑 实际开发中是不可能使用上方 Spring Security 默认的这种方式的如何去覆盖掉 Spring Security 默认的配置呢 我们以将默认的 form 认证方式改为 httpbasic 方式为例。 创建SpringSecurity自定义配置类WebSecurityConfig.java Slf4j Configuration EnableGlobalMethodSecurity(prePostEnabledtrue) public class WebSecurityConfig extends WebSecurityConfigurerAdapter {Overrideprotected void configure(HttpSecurity http) throws Exception {ExpressionUrlAuthorizationConfigurerHttpSecurity.ExpressionInterceptUrlRegistry registry http.authorizeRequests();registry.and()表单登录方式.formLogin().permitAll().and().logout().permitAll().and().authorizeRequests()任何请求.anyRequest()需要身份认证.authenticated().and()关闭跨站请求防护.csrf().disable()前后端分离采用JWT 不需要session.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)} }重新启动项目已经看到修改后的 httpbasic 方式认证了。 在这里我们依然采用的默认提供的用户名 user以及每次服务器启动自动生成的 password那么可不可以自定义认证逻辑呢比如采用数据库中的用户登陆 答案是肯定的。 自定义用户认证逻辑需要了解三步 处理用户信息获取逻辑处理用户校验逻辑处理密码加密解密 接下来我们来看一下这三步然后实现自定义登陆 3.1 处理用户信息获取逻辑 Spring Security 中用户信息获取逻辑的获取逻辑是封装在一个接口里的UserDetailService代码如下 public interface UserDetailsService {UserDetails loadUserByUsername(String username) throws UsernameNotFoundException; }这个接口中只有一个方法loadUserByUsername() 该接收一个 String 类型的 username 参数然后返回一个 UserDetails 的对象。 那么这个方法到底是干啥的呢 通过前台用户输入的用户名然后去数据库存储中获取对应的用户信息然后封装在 UserDetail 实现类里面。 封装到 UserDetail 实现类返回以后Spring Srcurity 会拿着用户信息去做校验如果校验通过了就会把用户放在 session 里面否则抛出 UsernameNotFoundException 异常Spring Security 捕获后做出相应的提示信息。 想要处理用户信息获取逻辑那么我们就需要自己去实现 UserDetailsService 新建 UserDetailsServiceImpl.java Slf4j Component public class UserDetailsServiceImpl implements UserDetailsService{Autowiredprivate UserService userService;/*** 从数据库中获取用户信息返回一个 UserDetails 对象* param username* return* throws UsernameNotFoundException*/Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {通过用户名获取用户User user userService.findByUsername(username);将 user 对象转化为 UserDetails 对象return new SecurityUserDetails(user);} }SecurityUserDetail.java public class SecurityUserDetails extends User implements UserDetails {private static final long serialVersionUID 1L;public SecurityUserDetails(User user) {if(user!null) {this.setUsername(user.getUsername());this.setPassword(user.getPassword());this.setStatus(user.getStatus());}}Overridepublic Collection? extends GrantedAuthority getAuthorities() {理想型返回 admin 权限可自已处理这块return AuthorityUtils.commaSeparatedStringToAuthorityList(admin);}/*** 账户是否过期* return*/Overridepublic boolean isAccountNonExpired() {return true;}/*** 是否禁用* return*/Overridepublic boolean isAccountNonLocked() {return true;}/*** 密码是否过期* return*/Overridepublic boolean isCredentialsNonExpired() {return true;}/*** 是否启用* return*/Overridepublic boolean isEnabled() {return true;} }至此处理用户信息获取逻辑 部分完成了主要实现 UserDetailsService 接口的 loadUserByname 方法。 为何会用到 SecurityUserDetail 类进行转换一下 其实完全可以直接返回一个 User 对象但是需要注意的是如果直接返回 User 对象的话返回的是 security 包下的 user。 至于为何这样处理如果返回的是 security 包下的 user这样就失去了使用本地数据库的意义下方自定义登陆逻辑详细说明。 再来登陆试一下 其中 niceyoo、****** 为数据库用户信息如下图为成功跳转 3.2 处理用户校验逻辑 关于用户的校验逻辑主要包含两方面 密码是否匹配【由Sprin Security处理只需要告诉其密码即可】密码是否过期、或者账户是否被冻结等 前者已经通过实现 UserDetailsService 的 loadUserByname() 方法实现了接下来主要看看后者。 用户密码是否过期、是否被冻结等等需要实现 UserDetails 接口 public interface UserDetails extends Serializable {Collection? extends GrantedAuthority getAuthorities();授权列表String getPassword();从数据库中查询到的密码String getUsername();用户输入的用户名boolean isAccountNonExpired();当前账户是否过期boolean isAccountNonLocked();账户是否被锁定boolean isCredentialsNonExpired();账户的认证时间是否过期boolean isEnabled();是账户是否有效。 }主要看后四个方法 1、isAccountNonExpired() 账户没有过期 返回true 表示没有过期 2、isAccountNonLocked() 账户没有锁定 3、isCredentialsNonExpired() 密码是否过期 4、isEnabled() 是否被删除 如上四个方法皆可根据实际情况做响应处理。 3.3 处理密码加密解密 再回到 WebSecurityConfig 自定义配置类。加入 Autowired private UserDetailsServiceImpl userDetailsService;Override protected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(userDetailsService).passwordEncoder(new BCryptPasswordEncoder());//加密 }配置了这个 configure 方法以后从前端传递过来的密码就会被加密所以从数据库查询到的密码必须是经过加密的而这个过程都是在用户注册的时候进行加密的。 补充UserDetailsServiceImpl 为自定义的 UserDetailsService 实现类。 四、个性化认证流程 同样的在实际的开发中对于用户的登录认证不可能使用 Spring Security 自带的方式或者页面需要自己定制适用于项目的登录流程。 Spring Security 支持用户在配置文件中配置自己的登录页面如果用户配置了则采用用户自己的页面否则采用模块内置的登录页面。 WebSecurityConfig 配置类中增加 成功、失败过滤器。 Autowired private AuthenticationSuccessHandler successHandler;Autowired private AuthenticationFailHandler failHandler;Override protected void configure(HttpSecurity http) throws Exception {ExpressionUrlAuthorizationConfigurerHttpSecurity.ExpressionInterceptUrlRegistry registry http.authorizeRequests();registry.and()表单登录方式.formLogin().permitAll()成功处理类.successHandler(successHandler)失败.failureHandler(failHandler).and().logout().permitAll().and().authorizeRequests()任何请求.anyRequest()需要身份认证.authenticated().and()关闭跨站请求防护.csrf().disable()前后端分离采用JWT 不需要session.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); }在添加 AuthenticationSuccessHandler、AuthenticationFailHandler 后会帮我们自动导包但是既然是个性化认证流程自然要我们自己去实现~ 那我们究竟要实现什么效果呢 自定义登陆成功处理 自定义登陆失败处理 为何要采用这种返回新式 用户登录成功后Spring Security 的默认处理方式是跳转到原来的链接上这也是企业级开发的常见方式但是有时候采用的是 Ajax 方式发送的请求往往需要返回 Json 数据如图中登陆成功后会把 token 返回给前台失败时则返回失败信息。 AuthenticationSuccessHandler Slf4j Component public class AuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {Overridepublic void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {String username ((UserDetails)authentication.getPrincipal()).getUsername();ListGrantedAuthority authorities (ListGrantedAuthority) ((UserDetails)authentication.getPrincipal()).getAuthorities();ListString list new ArrayList();for(GrantedAuthority g : authorities){list.add(g.getAuthority());}登陆成功生成tokenString token UUID.randomUUID().toString().replace(-, );token 需要保存至服务器一份实现方式redis or jwt输出到浏览器ResponseUtil.out(response, ResponseUtil.resultMap(true,200,登录成功, token));} }SavedRequestAwareAuthenticationSuccessHandle r是 Spring Security 默认的成功处理器默认方式是跳转。这里将认证信息作为 Json 数据进行了返回也可以返回其他数据这个是根据业务需求来定的比如上方代码在用户登陆成功后返回来 token需要注意的是此 token 需要在服务器备份一份毕竟要用做下次的身份认证嘛~ AuthenticationFailHandler Component public class AuthenticationFailHandler extends SimpleUrlAuthenticationFailureHandler {Overridepublic void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException e) throws IOException, ServletException {## 默认情况下不管你是用户名不存在密码错误SS 都会报出 Bad credentials 异常信息if (e instanceof UsernameNotFoundException || e instanceof BadCredentialsException) {ResponseUtil.out(response, ResponseUtil.resultMap(false,500,用户名或密码错误));} else if (e instanceof DisabledException) {ResponseUtil.out(response, ResponseUtil.resultMap(false,500,账户被禁用请联系管理员));} else {ResponseUtil.out(response, ResponseUtil.resultMap(false,500,登录失败其他内部错误));}}}失败处理器跟成功处理此雷同。 ResponseUtil: Slf4j public class ResponseUtil {/*** 使用response输出JSON* param response* param resultMap*/public static void out(HttpServletResponse response, MapString, Object resultMap){ServletOutputStream out null;try {response.setCharacterEncoding(UTF-8);response.setContentType(application/json;charsetUTF-8);out response.getOutputStream();out.write(new Gson().toJson(resultMap).getBytes());} catch (Exception e) {log.error(e 输出JSON出错);} finally{if(out!null){try {out.flush();out.close();} catch (IOException e) {e.printStackTrace();}}}} }其中用到 gson 依赖 !-- Gson -- dependencygroupIdcom.google.code.gson/groupIdartifactIdgson/artifactIdversion2.8.5/version /dependency最后 下一篇将集成 jwt 实现用户身份认证。 SpringSecurity 整合 JWThttps://www.cnblogs.com/niceyoo/p/10964277.html
http://www.zqtcl.cn/news/796357/

相关文章:

  • 大连制作网站报价网站网站怎么做代理
  • php做网站如何架构品牌vi设计欣赏
  • 网站外链建设与文章发布规范网址例子
  • 外贸网站空间选择商业计划书
  • 手机作图软件app专业做邯郸网站优化
  • 济南网站定制制作wordpress theid
  • 企业网站建设能解决什么问题设计房子需要多少钱
  • 专业网站开发制作石家庄信息门户网站定制
  • 藤虎网络广州网站建设网站域名实名认证官网
  • 佛山专业网站建设公司推荐it行业做网站一个月多少钱
  • 三网合一网站怎么做苏醒主题做的网站
  • wordpress站内统计插件wordpress模板 单栏
  • 龙岩网站定制网站开发 技术路线
  • 广州制作网站开发网站标题怎么设置
  • 海南旅游网站开发背景做网站兼容ie
  • 查找人网站 优帮云本地升级wordpress
  • 安庆什么网站好小事做wordpress主题vue
  • 高端商品网站网络运维工程师面试题及答案
  • 做网站的dw全称是啥适合迷茫年轻人的工作
  • 免费软件库合集软件资料网站wordpress go链接跳转错误
  • 重庆那里做网站外包好和镜像网站做友链
  • 网站栏目关键词装修效果图制作软件
  • 企业网站开发公司-北京公司北京医疗网站建设公司
  • 可以做配音兼职的网站产品网站怎样做外部链接
  • 如何制作网站效果图做外单要上什么网站
  • 网站开发预算编制网站可以制作ios
  • 强化网站建设网页翻译怎么弄出来
  • 长春火车站到龙嘉机场高铁时刻表视频网站建设公司排名
  • 武进网站建设代理商google官网下载
  • 简单网站开发流程图知乎怎么申请关键词推广