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

做装潢网站t和p在一起怎么做网站

做装潢网站,t和p在一起怎么做网站,图书馆建设投稿网站,定制网站建设公司文章目录 1、SpringSecurity原理2、UserDetails接口3、UserDetailService接口4、权限配置 1、SpringSecurity原理 Spring Security是做安全访问控制,对所有进入系统的请求进行拦截,并做校验,这可以通过Filter或者AOP实现,Spring …

文章目录

  • 1、SpringSecurity原理
  • 2、UserDetails接口
  • 3、UserDetailService接口
  • 4、权限配置

1、SpringSecurity原理

Spring Security是做安全访问控制,对所有进入系统的请求进行拦截,并做校验,这可以通过Filter或者AOP实现,Spring Security靠Filter。

在这里插入图片描述

  • 初始化Spring Security时,创建一个名为SpringSecurityFilterChain的Servlet过滤器,类型为org.springframework.security.web.FilterChainProxy,它实现了javax.servlet.Filter,因此外部的请求会经过此类
  • FilterChainProxy是一个代理,真正起作用的是FilterChainProxy中SecurityFilterChain所包含的各个Filter,同时这些Filter作为Bean被Spring管理
  • 这些Filter不负责认证或者授权,而是交给认证管理器(AuthenticationManager)和决策管理器(AccessDecisionManager)进行处理。(过滤器嘛,就是拦截下,获取点东西、修改点东西、干点操作)

Spring Security功能的实现就是一系列过滤器链相互配合。

在这里插入图片描述

  • SecurityContextPersistenceFilter 这个Filter是整个拦截过程的入口和出口,也就是第一个和最后一个拦截器。会在请求开始时从配置好的 SecurityContextRepository 中获取 SecurityContext,然后把它设置给 SecurityContextHolder。在请求完成后将 SecurityContextHolder 持有的 SecurityContext 再保存到配置好的 SecurityContextRepository,同时清除 securityContextHolder 所持有的 SecurityContext;

  • UsernamePasswordAuthenticationFilter 用于处理来自表单提交的认证,该表单必须提供对应的用户名和密码,其内部还有登录成功或失败后进行处理的 AuthenticationSuccessHandler 和 AuthenticationFailureHandler,这些都可以根据需求做相关改变;(这些处理器的逻辑可自定义,重新实现一下这个处理器)

  • ExceptionTranslationFilter 能够捕获来自 FilterChain 所有的异常,并进行处理。但是它只会处理两类异常:AuthenticationException 和 AccessDeniedException,其它的异常它会继续抛出。

  • FilterSecurityInterceptor 是用于保护web资源的,使用AccessDecisionManager对当前用户进行授权访问

SpringSecurity的执行流程:

在这里插入图片描述

  • 用户提交用户名密码,被安全过滤器链中的UsernamePasswordAuthenticationFilter过滤器拿到,并封装为请求Authentication,通常情况下是UsernamePasswordAuthenticationToken这个实现类
  • 然后过滤器将Authentication提交至认证管理器(AuthenticationManager)进行认证
  • 认证成功后,AuthenticationManager身份管理器返回一个被填充满了信息的(包括上面提到的权限信息,身份信息,细节信息,但密码通常会被移除)Authentication实例
  • SecurityContextHolder安全上下文容器将上一步填充了信息的Authentication,通过SecurityContextHolder.getContext().setAuthentication(…)方法,设置到其中
  • 以看出AuthenticationManager接口(认证管理器)是认证相关的核心接口,也是发起认证的出发点,它的实现类为ProviderManager
  • 而Spring Security支持多种认证方式,因此ProviderManager维护着一个List列表,存放多种认证方式,最终实际的认证工作是由AuthenticationProvider完成的。而web表单的对应的AuthenticationProvider实现类为DaoAuthenticationProvider,它的内部又维护着一个UserDetailsService负责UserDetails的获取。当UserDetailsService接口的loadUserByUsername()方法获取到的User Details对象中的密码和Authentication中的密码一致时,认证成功,最后AuthenticationProvider将UserDetails填充至Authentication

2、UserDetails接口

看完上面的UserDetails对象和UserDetailsService接口的loadUserByUsername方法后,再看之前在内存中定义用户,是这样的:

UserDetails user2 = User.builder().username("liu").password(passwordEncoder().encode("123456")).authorities("teacher:add","teacher:update").roles("teacher").build();

查看User类的源码,其实现了UserDetails接口,因此上面才可以直接创建User对象。

在这里插入图片描述

接下来自己定义一个用户类SecurityUser类,也去实现UserDetails接口,重写UserDetails接口方法时,直接写死一个用户信息,一会儿new这个自定义的SecurityUser类,也就和上面的User.builder一个意思。

public class SecurityUser implements UserDetails {@Overridepublic Collection<? extends GrantedAuthority> getAuthorities() {return null;   //未给权限}@Overridepublic String getPassword() {//明文为123456//return "$2a$10$KyXAnVcsrLaHMWpd3e2xhe6JmzBi.3AgMhteFq8t8kjxmwL8olEDq";return new BCryptPasswordEncoder().encode("123456");}@Overridepublic String getUsername() {return "liu";}@Overridepublic boolean isAccountNonExpired() {return true;}@Overridepublic boolean isAccountNonLocked() {return true;}@Overridepublic boolean isCredentialsNonExpired() {return true;}@Overridepublic boolean isEnabled() {return true;}
}

UserDetails 接口的7个方法如下图:

方法名作用
getAuthorities()获取当前用户对象所具有的角色信息
getPassword()获取当前用户对象的密码
getUsername()获取当前用户对象的用户名
isAccountNonExpired()当前账户是否未过期
isAccountNonLocked()当前账户是否未锁定
isCredentialsNonExpired()当前账户密码是否未过期
isEnabled()当前账户是否可用

3、UserDetailService接口

UserDetails的用户对象建好了,继续看之前在内存中创建用户的实现思路:

InMemoryUserDetailsManager userDetailsManager = new InMemoryUserDetailsManager();
userDetailsManager.createUser(user1);
userDetailsManager.createUser(user2);

InMemoryUserDetailsManager类实现了UserDetailsManager接口,UserDetailsManager接口又继承了UserDetailService接口:

在这里插入图片描述

自己新建一个类UserServiceImpl去实现UserDetailService接口。重写loadUserByUsernam方法,并当用户名等于自定义的SecurityUser对象中的用户名时,返回SecurityUser对象。

@Service
public class UserServiceImpl implements UserDetailsService {@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {SecurityUser securityUser= new SecurityUser();if(username==null || !username.equals(securityUser.getUsername())){throw new UsernameNotFoundException("该用户不存在");}return securityUser;}
}

以上其实是自己玩了下5.6两步:

在这里插入图片描述

重启服务,登录下,一切正常。

在这里插入图片描述

4、权限配置

上面自定义的SecurityUser类中,关于权限的方法返回null,写个接口返回认证信息,可以看到权限字段确实为null:
在这里插入图片描述
在这里插入图片描述

加权:

    @Overridepublic Collection<? extends GrantedAuthority> getAuthorities() {GrantedAuthority g1=()->"student:query"; //使用lambda表达式//GrantedAuthority g1=new SimpleGrantedAuthority("student:query");List<GrantedAuthority> grantedAuthorityList=new ArrayList<>();grantedAuthorityList.add(g1);return grantedAuthorityList;}

顺便使用@PreAuthorize注解方便后面看下效果:

@RestController
@RequestMapping("/student")
public class StudentController {@GetMapping("/query")@PreAuthorize("hasAuthority('student:query')")public String queryInfo(HttpServletRequest request){return "I am a student,My name is XXX";}
}

重启后查看认证信息:

在这里插入图片描述
在这里插入图片描述

梳理完UserDetails和UserDetailsService接口之间的流程和细节,方便后面理解SpringSecurity基于数据库认证。

http://www.mmbaike.com/news/69353.html

相关文章:

  • 专业的高密网站建设长安seo排名优化培训
  • 网站首页百度收录怎么做百度热词指数
  • 长春做网站公司长春网站排名上海网站建设方案
  • 深圳龙岗最新疫情内蒙古seo
  • 没有备案的网站可以做淘宝客网站维护合同
  • 淄博外贸网站制作青岛seo推广
  • 免费网站建设 优帮云品牌推广专员
  • 个人网站备案怎么做百度业务推广
  • 郑州网站建设专家怎么让百度收录网站
  • 大埔做网站百度公司简介介绍
  • 医院网站建设策划河南搜索引擎优化
  • dw网站制作中山网站建设公司
  • 网站中怎么做图片的变换南京seo排名优化公司
  • 台湾设计师网站免费域名注册服务网站
  • 蔚县做网站关键词推广seo
  • 谷城今日疫情百度快速收录seo工具软件
  • 河南网站备案地址软文写作什么意思
  • 做区块链网站的公司新闻头条今日要闻国内新闻最新
  • mysql做网站怎么查看数据营销策略从哪几个方面分析
  • 网站做政务网站策划是做什么的
  • 网站建设进展报告百度搜索排行榜风云榜
  • 杭州哪家公司做网站好没经验怎么开广告公司
  • 国内公关公司排名襄阳seo推广
  • 新品牌营销策划方案电商网站seo怎么做
  • 网站开发转码手机搜狗快速收录方法
  • 0元购怎么在网站做seo网站分析工具
  • icp备案网站建设方案书企业网站推广的一般策略
  • 网站页面设计怎么做推广平台软件有哪些
  • css个人简介网站怎么做数据平台
  • 路由器做网站教程网站页面设计模板