spring 认证授权

认证与授权

  • 认证

解决我是谁

  • 授权

解决我能做什么

1.1 原理

1.2 常见的过滤器

BasicAuthenticationFilter

  • 如果在请求中找到一个Basic Auth Http 头,如果找到,则尝试用该头中的用户名和密码验证用户。

UsernamePasswordAuthenticationFilter

  • 如果在请求参数或者post的Request Body 中找到用户名和密码,则尝试用这些值对用户进行身份验证。

DefaultLoginPageGeneratingFlter

  • 默认登录页面生成过滤器,用于生成一个登录页面,如果你没有明确地禁用这个功能,那么就会生成一个登录页面,这就是为什么在启用Spring Security 时,会得到一个默认登录页面的原因

DefaultLoginOutPageGeneratingFilter

  • 没有禁用该功能,则会生成一个注销页面

FilterSecurityInterceptor

  • 过滤安全拦截器。用于授权逻辑
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    // 设置配置 :用于配置路径的安全性
    @Override
    protected void configure(HttpSecurity http) throws Exception {
       http.authorizeRequests(req-> req.antMatchers("/test/**").authenticated())
               .formLogin(AbstractHttpConfigurer::disable)
               .httpBasic(withDefaults())
               .csrf(AbstractHttpConfigurer::disable);
    }


    // 设置不拦截资源 常用于忽略某些资源
    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().mvcMatchers("/public/**");
    }
}

1.3 Remember-me功能

为解决session过期用户的直接访问问题。

原理:使用Cookie 存储用户名,过期时间,以及一个Hash

Hash:md5(用户名+过期时间+密码+key)

1.4 定制登录/退出登录的处理

  • 登录成功后的处理:AuthenticationSuccessHandle
  • 登录失败后的处理:AuthenticationFailureHandle
  • 退出登录成功后的处理 :LogoutSuccessHandler

将json转化为java对象

ObjectMapper objectMapper = new ObjectMapper();
String carJson =
    "{ \"brand\" : \"Mercedes\", \"doors\" : 5 }";
Car car = objectMapper.readValue(carJson, Car.class);

将java对象转化为json

ObjectMapper objectMapper = new ObjectMapper();

Car car = new Car();

String json = objectMapper.writeValueAsString(car);

1.5 自定义拦截器

继承需要定义的拦截器对其进行自定义配置

2 密码

明文-哈希-加盐-自适应-?

自适应哈希:

配置迭代次数 md5(md5(“XX”))

配置随机的盐值

迭代次数和盐值存储在数据库中

Bcrypt,Scrypt,pdkdf2等

2.1 常用的JSR 380验证注解

@NotNull     : 验证注解属性值不为空。

@AssertTrue  : 验证注解属性值是否为真

@Size        : 验证注解的大小介于属性min和max之间

@Min         :  验证注解属性的值不小于值属性的值

@Max         : 验证被注解的值不大于值属性的值

@Email       : 验证注解的属性是一个有效的电子邮件地址

@Pattern     : 验证注解的属性是否匹配正则表达式  
 
@NotEmpty    : 验证属性不是空或空;应用于string

@NotBlank    :  只能用于文本值,验证属性不是空的

@Positive    : 使用于数值,验证它们是严格意义上的正数

@Negative    : 适用于数值,验证他们是严格意义上的负值

@Past        : 验证一个日期值是在过去

@Future      : 验证一个日期值是在未来
  

2.2 自定义验证

  • 自定义邮件注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = EmailValidator.class)
public @interface ValidEmail {
    String message () default "Invalid Email";

    Class<?> [] groups() default {};

    Class<? extends Payload>[] payload() default {};

}
  • 自定义邮件注解配置,利用正则表达式进行解析定义验证逻辑
public class EmailValidator implements ConstraintValidator<ValidEmail,String> {
    // 自定义正则表达式
    private final static String EMPTY_PATTERN="";
    @Override
    public void initialize(ValidEmail constraintAnnotation) {
        ConstraintValidator.super.initialize(constraintAnnotation);
    }

    @Override
    public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
        return validateEmail(s);
    }


    private boolean validateEmail(final String email){
        // 对正则表达式进行解析
        Pattern pattern = Pattern.compile(EMPTY_PATTERN);
        Matcher matcher = pattern.matcher(email);
        return  matcher.matches();
    }
}

2.3 密码的验证规则

密码的验证比较复杂,使用Passay框架进行验证,封装验证逻辑在注解中有效的剥离验证逻辑和业务逻辑

  • 引入passay
     <dependency>
            <groupId>org.passay</groupId>
            <artifactId>passay</artifactId>
            <version>${passay.version}</version>
        </dependency>
  • 自定义密码验证
@Target({ElementType.FIELD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = PasswordConstraintValidator.class)
public @interface ValidPassword {
    String message () default "Invalid Password";

    Class<?> [] groups() default {};

    Class<? extends Payload>[] payload() default {};
}
  • 使用passay自定义验证逻辑
public class PasswordConstraintValidator implements ConstraintValidator<ValidPassword,String> {
    @Override
    public void initialize(ValidPassword constraintAnnotation) {
        ConstraintValidator.super.initialize(constraintAnnotation);
    }

    @Override
    public boolean isValid(String password, ConstraintValidatorContext context) {
        PasswordValidator validator = new PasswordValidator(
                Arrays.asList(
                        //定义长度 6-20
                        new LengthRule(6,20),
                        //定义最少拥有一个英文字符
                        new CharacterRule(EnglishCharacterData.Alphabetical,1),
                        //定义至少拥有一个特殊字符
                        new CharacterRule(EnglishCharacterData.Special,1),
                        //禁止5个连续的字符
                        new IllegalSequenceRule(EnglishSequenceData.Alphabetical,5,false),
                        //禁止五个连续的数字
                        new IllegalSequenceRule(EnglishSequenceData.Numerical,5,false),
                        // 不允许空格
                        new WhitespaceRule()));
        RuleResult result = validator.validate(new PasswordData(password));
        if (result.isValid()) {
            return true;
        }
        //设置校验失败后的消息
        context.disableDefaultConstraintViolation();
        context.buildConstraintViolationWithTemplate(String.join(",", validator.getMessages(result)))
                .addConstraintViolation();
        return false;
    }
}

2.4 比较dto中两个字段是否相等(如 密码,以及再次输入密码)

  • 定义密码验证逻辑
public class PasswordMatchesValidator implements ConstraintValidator<PassWordMatches, UserDto> {

    @Override
    public void initialize(final PassWordMatches constraintAnnotation) { }

    @Override
    public boolean isValid(final UserDto obj, final ConstraintValidatorContext context) {
       UserDto user = (UserDto) obj;
        return user.getPassword().equals(user.getMatchPassword());
    }
}

2.5 异常的统一处理

使用网上开源zalando

    <dependency>    
      <groupId>org.zalando</groupId> 
       <artifactId>problem-spring-web</artifactId>   
     </dependency>

3 Spring Security 框架解析

基于数据库认证,实现一个可定制化的基础模型。

spring security 相关的单元测试。

3.1 核心组件

SecurityContext

  • 用来存储当前认证的用户的详细信息

SecurityContextHolader

  • 是一个工具类,提供了对安全上下文的访问,默认情况下使用ThreadLocal 对象来存储安全上下文

Authentication

  • 存储了当前用户的详细信息
  • Principal 可以理解为用户信息
  • credentials 可以理解为密码
  • Authorities 可以理解为权限

UserDetails在这里代表用户,而UserDetailsService 代表从用户数据库中调取用户形成UserDetails,这两个对象不负责认证工作只是提供数据,一般通过扩展他们来实现自定义的数据库结构

3.2 userDetails 和userDetailsService

  • userDetails代表用户,具备一系列属性约束
  • 数据存储中根据用户名找到用户,是由UserDetailsService定义的

本身不负责认证,只是提供数据,一般通过扩展他们来实现自定义的数据库结

扩展方式

  • 系统内建了jdbcuserDetailsManager,可以通过构造不同的sql进行深度的定制化。

  • 也可以实现自己的userDetails和userDetailsService 实现定制

### 回答1: Spring Security 是一个强大的安全框架,提供了身份认证授权机制。身份认证是指验证用户是否是可信用户的过程,授权是指决定用户是否有权限执行特定操作的过程。 Spring Security 提供了很多内置的身份验证机制,如基于表单的身份认证、基于HTTP基本身份验证、OpenID身份验证等。同时,它还支持各种自定义身份认证机制。 在授权方面,Spring Security 可以为应用程序提供很好的访问控制。它支持基于角色、基于权限和基于表达式等多种授权方式,同时也支持自定义授权机制。 Spring Security 可以与各种技术集成,如Spring框架、Spring Boot、OAuth、CAS等。通过使用 Spring Security,开发者可以方便地为他们的应用程序提供强大的身份验证和授权功能,以保护他们的应用程序免受各种安全攻击。 ### 回答2: Spring Security是一个由Spring社区开发的安全框架,为Spring应用程序提供了全面的安全性。它提供了许多有用的功能,可以轻松地实现基于角色的用户权限控制和身份验证。Spring Security使得开发人员可以专注于开发特定的应用程序功能,而不必从零开始开发身份认证授权功能。 Spring Security提供了多种身份验证和授权机制。最常见的身份验证机制是基于用户名和密码的验证方式。Spring Security提供了基本的用户名密码认证,也可以集成第三方身份验证系统,例如LDAP或CAS,实现单点登录功能。Spring Security的授权机制使用基于角色或基于资源的授权策略,可以实现细粒度的授权控制。 Spring Security提供了多种配置方式,包括XML配置、Java配置和注解配置。XML配置方式提供了完全控制的能力,Java配置方式提供了更加优雅的配置方式,而注解配置方式则提供了更加简洁明了的配置方式。使用Spring Security,开发者可以灵活地选择使用哪种配置方式。 Spring Security的核心是安全过滤器链。每个过滤器都集中处理一个特定的安全问题。通过为过滤器链添加或删除过滤器,可以自定义应用程序的安全行为。 总之,Spring Security是一个非常强大和灵活的安全框架,可以帮助开发人员轻松实现应用程序的身份认证授权功能。开发人员可以根据自己的需求选择合适的身份认证授权机制,并通过配置方式实现灵活和优雅的安全策略。 ### 回答3: Spring Security是一个基于Spring框架的应用安全框架,提供了一整套的认证(authentication)和授权(authorization)机制,为Java应用程序提供了安全保护。它可以控制web应用程序的访问权限,保护用户信息的安全性,还可以进行单点登录(SSO)等操作。 在Spring Security中,认证授权是两个核心概念。认证是指验证用户身份的过程,包括用户名称和密码的验证。Spring Security提供了多种认证方式,如基于表单的认证、HTTP基本认证等。授权则是指决定用户能够访问哪些资源的过程。Spring Security利用安全框架来控制对URL的访问,以及哪些用户具有哪些权限来访问应用程序中的功能。 Spring Security使用过滤器链(filter chain)来保护应用程序。这个过滤器链包括了许多安全性过滤器,它们通过拦截HTTP请求和响应来提供安全保护。每个过滤器都扮演了不同的角色,完成不同的操作。例如,UsernamePasswordAuthenticationFilter用于处理基于表单的用户认证请求,而AccessDecisionManager用于决定用户是否有权访问特定的资源。 Spring Security还提供了许多有用的功能,例如自定义表单登录、注销、记住我、角色层次结构等。它还可以与许多常见的身份验证和授权方案进行集成,如LDAP、OAuth2等。Spring Security的强大功能和灵活性使得它成为一个非常流行的Java认证授权框架。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值