Spring Security 框架基础知识问答
-
Spring Security框架主要解决了什么问题?
- 主要解决认证和授权的相关问题
-
BCrypt算法的主要特点是什么?
- BCrypt算法是用于对密码加密处理的算法,可以实现编码、验证,并且BCrypt算法默认使用可随机盐值即,即使使用的相同的原文,每次编码产生的密文都是不同的,而且BCrypt算法是慢速的,可以非常有限的避免穷举式的暴力破解
-
UUID的主要特点是什么?
1.能够保证在同一时空的唯一性
2.经由一定的算法机器生成
3.非人工指定.非人工识别 -
在继承了
WebSecurityConfigurerAdapter
的配置类中,重写void configurer(HttpSecurity http)
方法-
http.formLogin()
方法的作用是什么?
如果不重写的话,会supper 父类当中的configure(http)的方法,这个父类的方法设置的是所有请求都不需要通过认证,
可以直接访问.重写此方法,单独设置一个白名单(可以通过认证的url),以适应特定化需求
开启表单验证,如果已开启,当请求被视为未认证是,将重定向到登录表单页面,如果未开启,党请求被视为未认证是,将相应403 -
配置请求认证的过程中,调用的
mvcMatchers()
方法的作用是什么?
配置某些路径,需要配置和后续的某个方法一起使用,例如 parmitall()或者authenticated()等 -
配置请求认证的过程中,调用的
permitAll()
方法的作用是什么?
此方法默认的是可不通过认证即可访问,当设置了mvaMachers()方法时,即配置的路径不需要通过认证 -
配置请求认证的过程中,如果某个路径被多次匹配,最终此路径的规则是什么?
以第1次配置的为准 -
http.csrf().disable()
的作用是什么?
防止伪造跨域攻击的禁用
-
-
UserDetailsService
的作用是什么?- 默认情况下 Spring Security 框架提供了默认的用户名和启动时UUID生成的随机密码,如果需要自定义账号登录
便需要重写UserDetailsService当中的loadUserByUsername(String username)方法,重写后,便不再生成UUID
- 默认情况下 Spring Security 框架提供了默认的用户名和启动时UUID生成的随机密码,如果需要自定义账号登录
-
如何得到
AuthenticationManager
对象?- 在继承了WebSecurityConfigurerAdapter的配置类中,重写authenticationMannagerBean()方法,在此方法上添加@Bean
注解即可,后续,当需要使用此对象时,使用自动装配机制即可.
- 在继承了WebSecurityConfigurerAdapter的配置类中,重写authenticationMannagerBean()方法,在此方法上添加@Bean
-
当调用
AuthenticationManager
对象的authenticate()
方法后,会发生什么?此方法的返回结果是什么?- 调用了authenticate()方法后,Spring Security 会开始执行认证,会通过参数中的用户名来调用UserDetailsService接口类型的对象loadUserByUsername()方法,当得到了此方法的返回结果后,自动执行后续的判断,例如密码是否匹配,账号是否被禁用等如果通过认证,会返回
Authentication
接口类型的对象,此对象通常有三大组成部分,分别是Pincipal(当事人),Credentials(凭证),Authorities(权限清单),其中,Principal就是loadUserByUsername()方法返回的结果.
- 调用了authenticate()方法后,Spring Security 会开始执行认证,会通过参数中的用户名来调用UserDetailsService接口类型的对象loadUserByUsername()方法,当得到了此方法的返回结果后,自动执行后续的判断,例如密码是否匹配,账号是否被禁用等如果通过认证,会返回
-
Spring Security如何判定某个请求是否已经通过认证?
- 依据
SecurityContext
(Security上下文)中的认证信息(Authentication)来判定当前是否已经通过认证
- 依据
-
相比Session机制,JWT最大的优点是什么?
- JWT(JSON WEB TOKEN)是一种JSON格式来组织数据的token ,不需要占用太多的内存空间,可以长时间保存用户信息
-
在Spring Security的配置类的
void configurer(HttpSecurity http)
方法中,http.cors()
的作用是什么?- 启用Spring Security的CorsFilter过滤器,此过滤器可以对复杂请求的预检放行
-
根据业内惯用的作法,客户端应该如何携带JWT数据向服务器提交请求?
- 客户端应该通过请求头中的authorization属性携带jwt
-
在服务器端,为什么要使用过滤器而不是其它组件来解析JWT?
- 过滤器是 Java EE 体系中最早接收到请求的组件,由于若干个不同的请求都需要识别客户端的身份,所以,应该通过能够统一处理的组件来处理jwt,同时,此项任务必须在Spring Security的过滤器处理认证授权,检查上下文之前执行,所以,此项任务只能通过自定义过滤器处理
-
在服务器端,JWT过滤器的主要作用是?
- 获取客户端携带的jwt,解析客户端携带的jwt,如果携带的是有效信息,则应该从中获取用户信息,用于创建认证信息(Authentication),并返回认证信息到Security上下文中
-
如果客户端提交的请求没有携带JWT,服务器端的JWT过滤器应该如何处理?
- 直接放行,交给其他组件进行处理
-
在Spring Security的配置类的
void configurer(HttpSecurity http)
方法中,为什么要通过http.addFilter()
系列方法添加JWT过滤器?- 保证jwt过滤器在Spring Security 的过滤器之前执行,通过该系列方法装配JWT过滤器到框架中
-
在服务器端,控制器处理请求时,如何获取当事人信息?
- 在处理请求的方法的参数列表中,使用@AuthenticationPrincipal注解,添加在当事人类型的参数上当事人的类型,就是Secuirity上下文中Authentication对象的当事人类型
-
在服务器端,如何配置方法级别的权限?
- 添加@EnableGlobalMethodSecurity在配置类上添加@EnableGlobalMethodSecurity(prePostEnabled = true)注解,这是一次性配置
在方法上(通常是处理请求的方法上)使用@PreAuthorize注解来配置权限规则
- 添加@EnableGlobalMethodSecurity在配置类上添加@EnableGlobalMethodSecurity(prePostEnabled = true)注解,这是一次性配置