SpringSecurity数据库和内存验证入门

概念

通过AOP的方式对请求的资源进行拦截,只有用户含有特定的权限才能被放行

导包(基于springboot)


    org.springframework.boot
    spring-boot-starter-security

后期使用mysql数据库进行认证


    mysql
    mysql-connector-java


    org.springframework.boot
    spring-boot-starter-jdbc

基于内存中的用户管理

首先因该自己写一个类继承WebSecurityConfigurerAdapter,加上@EnableWebSecurity注解,表明这是一个springsecurity的配置类

@EnableWebSecurity
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //首页都可以访问
        http.authorizeRequests()
                .antMatchers("/", "/index").permitAll()
                .antMatchers("/level1/**").hasRole("vip1");
        http.formLogin();
        http.logout().logoutSuccessUrl("/");
    }
}

添加用户

可以通过重写WebSecurityConfigurerAdapter方法或者是添加bean的方法来添加用户对象

@Bean
public UserDetailsService users() {
    UserDetails user = User.builder()  //withDefaultPasswordEncoder不加密的方式(明文账号密码)
            .username("user")
            .password("{bcrypt}$2a$10$s41u/ZpT9Xe208wjPIsh4eFQsBzBnEblNDxVKxQvvbr2vCnkMsCp2")   //加密方式,防止泄露源码
            .roles("vip1")
            .build();
    return new InMemoryUserDetailsManager(user);
}

由于防止在反编译的时候获取密码,所以要使用加密,默认使用BCryptPasswordEncoder这个类实现加密,在设置密码的时候加上加密方式
在使用页面进行登入的时候就能实现自动识别和授权操作

基于数据库的认证(jdbc)

创建数据库(MySql)

通过更改脚本

CREATE TABLE `users` (
  `username` varchar(50) NOT NULL,
  `password` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  `enabled` tinyint(1) NOT NULL,
  PRIMARY KEY (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci


CREATE TABLE `authorities` (
  `username` varchar(50) NOT NULL,
  `authority` varchar(50) NOT NULL,
  UNIQUE KEY `ix_auth_username` (`username`,`authority`),
  CONSTRAINT `fk_authorities_users` FOREIGN KEY (`username`) REFERENCES `users` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

数据库架构图:SpringSecurity数据库和内存验证入门_第1张图片

添加用户

可以直接使用JdbcUserDetailsManager(datasource)进行添加

UserDetails user = User.builder()  //withDefaultPasswordEncoder不加密的方式(明文账号密码)
        .username("test")
        .password("{bcrypt}$2a$10$s41u/ZpT9Xe208wjPIsh4eFQsBzBnEblNDxVKxQvvbr2vCnkMsCp2")   //加密方式,防止泄露源码
        .roles("vip1")
        .build();
JdbcUserDetailsManager jdbcUserDetailsManager = new JdbcUserDetailsManager(dataSource);
jdbcUserDetailsManager.createUser(user);

验证用户

将JdbcUserDetailsManager(dataSource)添加到spring容器中就能自动读取数据库的用户和权限数据

@EnableWebSecurity
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //首页都可以访问
        http.authorizeRequests()
                .antMatchers("/", "/index","/addUser").permitAll()
                .antMatchers("/level1/**").hasRole("vip1");
        http.formLogin();
        http.logout().logoutSuccessUrl("/");
    }

    @Bean
    public UserDetailsService users() { //内存中验证
        UserDetails user = User.builder()  //withDefaultPasswordEncoder不加密的方式(明文账号密码)
                .username("user")
                .password("{bcrypt}$2a$10$s41u/ZpT9Xe208wjPIsh4eFQsBzBnEblNDxVKxQvvbr2vCnkMsCp2")   //加密方式,防止泄露源码
                .roles("vip1")
                .build();
        return new InMemoryUserDetailsManager(user);
    }

    @Bean
    public UserDetailsService users(@Autowired DataSource dataSource) { //数据库验证
        return new JdbcUserDetailsManager(dataSource);  //读取来自数据库的数据(同时可以添加用户)
    }
}

你可能感兴趣的:(spring-security)