准备春季专业认证。 春季安全

本文是Spring Professional Certification Prep文章的翻译。


它将涵盖Spring Security的主题及其主要问题。


它也可以用来准备面试。


↓其他文章在目录的链接中可用↓


目录
  1. 依赖注入,容器,IoC,bean
  2. AOP(面向方面​​的编程)
  3. JDBC,事务,JPA,Spring数据
  4. 春季靴
  5. 春季MVC
  6. 春季安全
  7. 休息
  8. 测试中




问题本身:


什么是身份验证和授权?

身份验证是验证计算机系统用户的过程。
这是在春季发生的情况:


  1. 结果密码和用户名将转换为UsernamePasswordAuthenticationToken的实例。 它实现了Authentication接口。
  2. 令牌传递到AuthenticationManager对象进行验证
  3. 如果成功,则AM返回填充的Authentication对象
  4. 通过调用SecurityContextHolder.getContext().setAuthentication(...)设置安全上下文SecurityContextHolder.getContext().setAuthentication(...)

授权是验证用户具有执行操作所需角色的过程。 授权期间,将检查您是否具有访问资源的适当权限。


工艺流程:


  1. 通过主体,显示用户的角色
  2. 根据资源角色检查​​了用户角色

首先,进行身份验证,然后进行身份验证。


安全如何在内部工作?
  • 使用从AbstractSecurityInterceptor类继承的Spring AOP代理。


    它用于调用授权的方法。


  • 安全Web基础结构基于Servlet过滤器。



第一步是配置DelegatingFilterProxy过滤器。 他将请求委托给FilterChainProxy


FilterChainProxy是在构造函数中接受一个或多个SecurityFilterChain的bean。


SeccurityFilterChain将请求中的URL与过滤器列表进行比较。



Spring Security涉及的主要功能

SecurityContextHolder包含并提供对应用程序中SecurityContext的访问。


SecurityContext包含身份验证对象的Spring Security的默认实现。


Authentication -为身份验证请求或已身份验证的主体提供令牌。 它还包含委托人有权使用的权力列表。


GrantedAuthority包含授予已GrantedAuthority主体的权限。


UserDetails包含有关用户的信息:密码,登录名,权限。 成功认证后,此信息用于创建Authentication对象。


UserDetailsService此服务从存储库(程序存储器,数据库等)中提取有关用户的信息,并将其放入UserDetails中。


什么是委托代理过滤器?

DelegatingFilterProxy类是实现javax.Servlet.Filter接口的类。


这是一个特殊的过滤器,它将工作委派给其他Bean,它们也是过滤器。


什么是安全过滤器链?

筛选器链实现SecurityFilterChain接口。 Spring Security提供的实现是DefaultSecurityFilterChain。


DSFC构造函数接受几个参数。 第一个参数是请求匹配器。 其余参数是实现servlet.Filter接口的过滤器。 这是DSFC接受的所有过滤器:


  • ChannelProcessingFilter
  • SecurityContextPersistenceFilter
  • ConcurrentSessionFilter
  • 任何身份验证。 筛选器: UserNamePasswordAuthenticationFilter / CasAythenticationFilter / BasicAuthenticationFilter
  • SecurityContextHolderAwareRequestFilter
  • JaasApiIntegrationFilter
  • RemeberMeAuthenticationFilter
  • AnonymusAuthenticationFilter
  • ExceptionTranslationFilter
  • FilterSecurityInterceptor

什么是安全上下文?

主要对象是SecurityContextHolder 。 在此存储有关当前安全上下文的详细信息,例如,当前正在使用该应用程序的主体的详细信息。 默认情况下, ThreadLocal用于存储。


 // SecurityContext SecurityHolderContext.getContext() 

getContext()方法返回的对象是SecurityContext 。 它允许您获取和设置Authentication对象。


Authentication表示以下属性:


  • 授予委托人的权力的集合
  • 用户识别数据(登录名,密码)
  • 详细信息-添加。 信息(如果需要)。 可能为空
  • 校长
  • 身份验证标志-布尔变量,指示主体是否成功通过测试

如何在特定的URL上设置用户点击拦截?
 @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() //    /resources .antMatchers("/resources/**").permitAll() //      2  .antMatchers("/").hasAnyRole("ANONYMOUS", "USER") .antMatchers("/login)*").hasAnyRole("ANONYMOUS", "USER") .antMatchers("/logoutr").hasAnyRole("ANONYMOUS", "USER") //      ADMIN .antMatchers("iadmin/*").hasRole("ADMIN") .antMatchers("/events/").hasRole("ADMIN") } 

*在antMatchers和mvcMatchers()方法中是什么意思?

此表达的意思是“任何”。


有两种类型:


  • * -仅在使用它的级别截取。


    例如,如果用户关注以下内容,则模式“ / orders / *”将检查用户的权限


    /订单/外星人或/订单/ 1,但不是/订单/外星人/ 1。


  • ** -在所有级别拦截。
    任何请求都会被检查/订单/外星人/ /订单/ 1,/订单/外星人/ 1。



为什么mvcMatcher比antMatcher更安全?

因为antMatcher(“/service”)仅将请求路径映射到“/service” ,而mvcMatcher(“/service”)映射到“/service”“/service.html” “/service” “/service.html” ,“ / service.abc” 。


Spring是否支持密码哈希? 什么是盐?

是的,确实如此。 有一个用于散列的PasswordEncoder接口,它仅包含一种方法:


static PasswordEncoder createDelegatingPasswordEncoder() ,它返回默认的DelegatePasswordEncoder


Salt用于计算密码哈希值。 这是一个随机数序列,用于将文本密码转换为哈希。 盐以清晰的形式存储在哈希密码旁边,并且可以在以后使用新的用户登录名将干净密码转换为哈希时使用。


为什么需要方法的保护? 如何安装?

Spring Security支持保护Bean(例如,控制器)中的各个方法。 这是应用程序的附加保护层。


必须使用@EnableGlobalMethodSecurity注释明确指定它。


@RolesAllowed注释有什么作用?

该注释基于JSR-250。
@RolesAllowed允许您使用角色配置对方法的访问(例如,在控制器类中)。
示例: @RolesAllowed(“ADMIN”)仅允许具有ADMIN角色的用户


要使用它,您需要在@Configuration类上设置@EnableGlobalMethodSecurity(jsr250Enabled=true) +您需要将此注释放在类路径中。


告诉我们有关@PreAuthorize的信息

@PreAuthorize允许您使用SpEL配置对方法的访问。
要使用它,您需要设置@EnableGlobalMethodSecurity(prePostEnabled=true)


所有这些注释如何实现?

端到端功能是通过Spring AOP(代理对象)使用的。

Source: https://habr.com/ru/post/zh-CN470786/


All Articles