Spring Security (基本入门)

Spring Security (基本入门) ,第1张

文章目录
      • 1.Spring Security 概述
      • 2.基本入门
      • 3.自定义用户名和密码
        • 3.1 配置文件
        • 3.2 配置类
        • 3.3 自定义用户名和密码
      • 4.应用场景
      • 5.两个很重要的接口
        • 5.1 UserDetailsService
        • 5.2 PasswordEncoder接口

1.Spring Security 概述

Spring Security是一个高度自定义的安全框架。利用Spring IoC/DI和AOP功能,为系统提供了声明式安全访问控制功能,减少了为系统安全而编写大量重复代码的工作。

正如你可能知道的关于安全方面的两个主要区域是“认证”和“授权”(或者访问控制)。这两点也是Spring Security重要核心功能。“认证”,是建立一个他声明的主体的过程(一个“主体”一般是指用户,设备或一些可以在你的应用程序中执行动作的其他系统),通俗点说就是系统认为用户是否能登录。“授权”指确定一个主体是否允许在你的应用程序执行一个动作的过程。通俗点讲就是系统判断用户是否有权限去做某些事情。

2.基本入门

整合SpringBoot

pom:

        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>

        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-securityartifactId>
        dependency>

        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-testartifactId>
            <scope>testscope>
        dependency>

自动装配就将过滤器链装配进容器了。

定义一个控制器:

@RestController
@RequestMapping("/test")
public class TestController {
    @GetMapping("/hello")
    public String hello(){
        return "hello";
    }
}


访问路径 localhost:8080/test/hello


用户名为 user, 密码为 9df0a5b8-9f67-4c42-8b78-ea7a7968afcc

3.自定义用户名和密码
  • 1.配置文件
  • 2.配置类
  • 3.自定义类定义用户名和密码
3.1 配置文件



3.2 配置类

这里的配置类中定义了一种加密方式, 和通过继承WebSecurityConfigurerAdapter 类, 实现了configure方法取定义用户名和密码。

@Configuration
public class Config01 extends WebSecurityConfigurerAdapter {
    @Bean
    public PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser("root01")
                .password(new BCryptPasswordEncoder().encode("root01"))
                .roles("admin");
    }
}


3.3 自定义用户名和密码

自定义一个service 实现 UserDetailService
用户名:root02 密码:root02

@Service
public class MyUserDetailService implements UserDetailsService {
    @Override
    public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
        List list = AuthorityUtils.commaSeparatedStringToAuthorityList("role");
        return new User("root02", new BCryptPasswordEncoder().encode("root02"), list);
    }


}

定义的配置了去引用这个service

@Configuration
public class Config02 extends WebSecurityConfigurerAdapter {
    @Resource
    private MyUserDetailService myUserDetailService;
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(myUserDetailService).passwordEncoder(new BCryptPasswordEncoder());
    }

    @Bean
    public PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }
}



最后的这种方法以后通过访问数据库来授权。

4.应用场景
  • 对已有项目添加认证功能
  • 需要有权限控制的项目都可以使用Spring Security。
5.两个很重要的接口

上面通过两个接口实现了自定义用户名和密码

5.1 UserDetailsService

返回值UserDetails, 为一个接口

它的实现类为User。

在User类中提供了很多方法和属性。


其中构造方法有两个,调用其中任何一个都可以实例化UserDetails实现类User类的实例。而三个参数的构造方法实际上也是调用7个参数的构造方法。

  • username:用户名
  • password:密码
  • authorities:用户具有的权限。此处不允许为null

此处的用户名应该是客户端传递过来的用户名。而密码应该是从数据库中查询出来的密码。Spring Security会根据User中的password和客户端传递过来的password进行比较。如果相同则表示认证通过,如果不相同表示认证失败。

authorities里面的权限对于后面学习授权是很有必要的,包含的所有内容为此用户具有的权限,如有里面没有包含某个权限,而在做某个事情时必须包含某个权限则会出现403。通常都是通过AuthorityUtils.commaSeparatedStringToAuthorityList(“”)来创建authorities集合对象的。参数时一个字符串,多个权限使用逗号分隔。

方法参数
方法参数表示用户名。此值是客户端表单传递过来的数据。默认情况下必须叫username,否则无法接收。

异常
UsernameNotFoundException 用户名没有发现异常。在loadUserByUsername中是需要通过自己的逻辑从数据库中取值的。如果通过用户名没有查询到对应的数据,应该抛出UsernameNotFoundException,系统就知道用户名没有查询到。

5.2 PasswordEncoder接口

  • encode: 把参数按照特定的解析规则进行解析。
  • mathes: 验证从存储中获取的编码密码与编码后提交的原始密码是否匹配。
  • upgradeEncoding: 如果解析的密码能够再次进行解析且达到更安全的结果则返回true,否则返回false。默认返回false。

实现类:


BCryptPasswordEncoder为官方推荐的解析器, 是对bcrypt强散列方法的具体实现。是基于Hash算法实现的单向加密。可以通过strength控制加密强度,默认10.

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/889593.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-14
下一篇 2022-05-14

发表评论

登录后才能评论

评论列表(0条)

保存