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

怎么选择一家好的网站建设公司苏州网站排名

怎么选择一家好的网站建设公司,苏州网站排名,工信部网站备案怎么查,个人建设网站流程图1.SpringSecurity的基础知识 SpringSecurity是spring中的一个安全管理框架,对比另一个安全框架shiro,他提供了更丰富的功能。一般来说web应用需要进行认证和授权。 认证:验证当前访问系统的是不是本系统的用户,并且要确认是具体…

1.SpringSecurity的基础知识

SpringSecurity是spring中的一个安全管理框架,对比另一个安全框架shiro,他提供了更丰富的功能。一般来说web应用需要进行认证和授权。

认证:验证当前访问系统的是不是本系统的用户,并且要确认是具体哪一个用户

授权:经过认证后判断当前用户是否有权限进行某个操作

这两个操作就是SpringSecurity作为安全框架的核心功能

2.快速入门

先试用springboot快速构建web项目,编写pom依赖,编写启动类,编写controller。然后在pom中引入springsecurity的依赖

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency>

引入依赖后,它会自动在请求接口之前加一个拦截器,具体就是当你请求controller中的接口时会首先跳转到一个springsecurity的界面,登录之后才能进行接口访问。

3.认证

3.1 登录校验流程

(1)用户在登录界面发起登录请求时会携带账户和密码,同时这个登录的接口是直接在拦截器的配置里配置为放行的,然后服务器接收到账户密码进行数据库查询和比对,一致的话会根据账户id或者用户名使用jwt的工具类生成一个jwt的令牌然后返回给前端,这个token包含的信息为用户的id和她的权限信息。

(2)登录完成后进行其他接口请求的时候,这个jwt令牌或者token就会和接口一起传给服务端,然后服务端的springsecurity的拦截器就会先拦截这个请求,然后解析这个token,取出这个token里面的信息,例如用户id,权限信息,如果当前请求用户具有这个权限则会放行,然后就是正常的访问资源的流程。

3.2 springsecurity完整流程

springsecurity原理是一个过滤器链条,这个链条包含了各种功能的过滤器,其中有些是核心过滤器,就是用的最多的。

(1)UsernamePasswordAuthenticationFilter:负责处理我们在登陆页面填写了用户名密码后的登陆请求。入门案例的认证工作主要有它负责。

(2)ExceptionTranslationFilter: 处理过滤器链中抛出的任何AccessDeniedException和AuthenticationException 。

(3)FilterSecurityInterceptor: 负责权限校验的过滤器。

3.3 认证详细的流程,主要是UsernamePasswordAuthenticationFilter

(1)拦截器拦截请求获取到用户名和密码

(2)调用UsernamePasswordAuthenticationFilter的实现类就是调用Authentication接口,解析jwt的token获取到用户信息,把用户名和密码封装成Authentication对象,只不过目前的Authentication对象里面的信息只有用户名和密码,还没有权限信息

(3)Providermanager调用AuthenticationManager接口进行认证

(4)AuthenticationManager调用DaoAuthenticationProvider的authenicate方法进行认证

(5)authenicate调用loadUserByUsername方法就是UserDetailsService接口查询用户,然后通过用户名查询到这个用户的权限信息,然后把该用户信息和权限信息封装成UserDetails对象

(6)调用UserDetails接口把UserDetails对象设置到Authentication对象中

(7)返回Authentication对象

(8)如果7返回了对象,就将其对象缓存在服务端本地,一般缓存在redis,方便下一次身份验证

4.实战

认证

(1)引入redis,fastjson,jwt的依赖

(2)导入redis的工具类和设置redis配置,方便调用方法。导入jwt的工具类。导入json响应类,设置数据库实体类,配置好mybatisplus和mysql等的依赖,mapper和yml等

(3)创建一个类实现UserDetailsService接口,重写其中的方法。增加用户名从数据库中查询用户信息

(4)编写一个登录接口

(5)我们需要编写springsecurity的config文件,然后把登录接口放行

(6)登录成功后生成jwt的token存入redis然后返回给前端

(7)因为自带的过滤器方法并不能实现查数据库,因此我们需要自行自定义一个过滤器,然后实现查询数据库进行权限查询和账户验证

(8)退出的逻辑是,先从SecurityContextHolder中获取到信息,然后去redis中查询并把它删除

授权

(1) SpringSecurity为我们提供了基于注解的权限控制方案,我们可以使用注解去指定访问对应的资源所需的权限。但是要使用它我们需要先开启相关配置。

@EnableGlobalMethodSecurity(prePostEnabled = true)

然后就可以使用对应的注解。@PreAuthorize

@RestController
public class HelloController {@RequestMapping("/hello")@PreAuthorize("hasAuthority('test')")public String hello(){return "hello";}
}

在重写UserDetailsServiceImpl时,在查询出用户后还要获取对应的权限信息,封装到UserDetails中返回。修改LoginUser实现UserDetails然后写入权限信息,UserDetails的实现类LoginUser,想要让其能封装权限信息就要对其进行修改。

@Data
@NoArgsConstructor
public class LoginUser implements UserDetails {private User user;//存储权限信息private List<String> permissions;public LoginUser(User user,List<String> permissions) {this.user = user;this.permissions = permissions;}//存储SpringSecurity所需要的权限信息的集合@JSONField(serialize = false)private List<GrantedAuthority> authorities;@Overridepublic  Collection<? extends GrantedAuthority> getAuthorities() {if(authorities!=null){return authorities;}//把permissions中字符串类型的权限信息转换成GrantedAuthority对象存入authorities中authorities = permissions.stream().map(SimpleGrantedAuthority::new).collect(Collectors.toList());return authorities;}@Overridepublic String getPassword() {return user.getPassword();}@Overridepublic String getUsername() {return user.getUserName();}@Overridepublic boolean isAccountNonExpired() {return true;}@Overridepublic boolean isAccountNonLocked() {return true;}@Overridepublic boolean isCredentialsNonExpired() {return true;}@Overridepublic boolean isEnabled() {return true;}
}

 LoginUser修改完后我们就可以在UserDetailsServiceImpl中去把权限信息封装到LoginUser中了。我们写死权限进行测试,后面我们再从数据库中查询权限信息。

@Service
public class UserDetailsServiceImpl implements UserDetailsService {@Autowiredprivate UserMapper userMapper;@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();wrapper.eq(User::getUserName,username);User user = userMapper.selectOne(wrapper);if(Objects.isNull(user)){throw new RuntimeException("用户名或密码错误");}//TODO 根据用户查询权限信息 添加到LoginUser中List<String> list = new ArrayList<>(Arrays.asList("test"));return new LoginUser(user,list);}
}

校验的时候从redis中获取权限

@Component
public class JwtAuthenticationTokenFilter extends OncePerRequestFilter {@Autowiredprivate RedisCache redisCache;@Overrideprotected void doFilterInternal(HttpServletRequest resuest, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {//获取tokenString token = resuest.getHeader("token");if (!StringUtils.hasLength(token)) {//放行filterChain.doFilter(resuest, response);return;}//解析tokenString userId;try {Claims claims = JwtUtil.parseJWT(token);userId = claims.getSubject();} catch (Exception e) {e.printStackTrace();throw new RuntimeException("token非法");}//从redis中获取用户信息String redisKey = SysConsts.LOGIN_KEY + ":" + userId;LoginUser loginUser = redisCache.getCacheObject(redisKey);if (Objects.isNull(loginUser)) {throw new RuntimeException("用户未登录");}//存入SecurityContextHolder//TODO 获取权限信息封装到Authentication中UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginUser, null,loginUser.getAuthorities());SecurityContextHolder.getContext().setAuthentication(authenticationToken);//放行filterChain.doFilter(resuest, response);}
}
(2)从数据库查询权限信息,使用RBAC权限模型, RBAC权限模型(Role-Based Access Control)即:基于角色的权限控制。这是目前最常被开发者使用也是相对易用、通用权限模型。

(3)导入数据库表,引入实体类,写好mqpper,配置yml文件

(4)在UserDetailsServiceImpl中去调用该mapper的方法查询权限信息封装到LoginUser对象中即可。


文章转载自:

http://noAskZaH.rhkgz.cn
http://QFH8UPaB.rhkgz.cn
http://h4WDW1dv.rhkgz.cn
http://uJyYVxPX.rhkgz.cn
http://IBf8Tl6Y.rhkgz.cn
http://3gwUvT0t.rhkgz.cn
http://rLuD0X9I.rhkgz.cn
http://CecDHS4z.rhkgz.cn
http://KPQLw2Fg.rhkgz.cn
http://8JU6pHSY.rhkgz.cn
http://cTy2Ay4K.rhkgz.cn
http://J5WnNBxD.rhkgz.cn
http://Qd2MCtYJ.rhkgz.cn
http://mh6IStab.rhkgz.cn
http://doNrrHSZ.rhkgz.cn
http://oNOdEUkg.rhkgz.cn
http://BJP6lg9e.rhkgz.cn
http://SxeqzpUJ.rhkgz.cn
http://6NBUzggH.rhkgz.cn
http://cN8AvjVV.rhkgz.cn
http://5SKIVnmw.rhkgz.cn
http://f8xNDlfW.rhkgz.cn
http://qDmbUDUz.rhkgz.cn
http://qUY36zIU.rhkgz.cn
http://H8ZWK8Oc.rhkgz.cn
http://udCSNVh0.rhkgz.cn
http://BESI0i1s.rhkgz.cn
http://jo4o00bv.rhkgz.cn
http://Q30yyFvM.rhkgz.cn
http://077IuC2L.rhkgz.cn
http://www.dtcms.com/wzjs/621074.html

相关文章:

  • 怎么才能让网站图文展示网站单页面怎么做
  • 阎良网站建设30天网站建设实录光盘云盘
  • 188旅游网站管理系统6.0模板益阳市 网站建设
  • 域名可以绑定几个网站网站图片如何做超链接
  • 无需代码制作app软件北京seo运营推广
  • 网站建设工作室 怎么样用网站做淘客怎么赚钱
  • 上海做网站大的公司建设行政主管部门政务网站
  • 揭阳seo网站管理mysql 网站空间
  • 网站建设卖花网站的目的网络营销心得体会300字
  • 做建站较好的网站多语言 网站
  • 网站策划报告书怎么做wordpress编辑器 代码
  • 美食网站建设服务策划书it项目外包网
  • 内蒙古赤峰市建设局网站企业网站群建设规范
  • 做网站到八方资源网怎么样做网站全包
  • 营销型网站建设公司哪家建设seo专员工作累吗
  • 怎么使用网站程序专业团队朋友圈文案
  • 网站说明怎么写企业营销型展厅设计价目表
  • 深圳网站建设黄浦网络洛阳已经开始群体感染了
  • 鹤壁企业网站建设信誉好的福州网站建设
  • 教研网站建设方案优化网站佛山厂商
  • 去了哪找网站建设公司wordpress略缩图图片变形怎么办
  • 网站建设分工方案wordpress themeforest
  • 如何扫描一个网站的漏洞wordpress英文换成中文
  • 东南亚购物网站排名wordpress版本伪装
  • 网站案例 网站建设北京网络科技有限公司官网
  • 成都网站建设的定位长春seo优化企业网络跃升
  • 简约、时尚、高端 网站建设wordpress重置密码邮件
  • 网站怎么加代码厦门人才网个人会员
  • tp5 商城网站开发建设网站的平台
  • 米拓做网站图片在哪里删掉做网站需要会哪些知识