栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringSecurity学习笔记3

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringSecurity学习笔记3

一、UserDetails接口

1.UserDetails:接口,表示用户信息
接口中定义的方法如下:

//权限的集合
    Collection getAuthorities();
    String getPassword();
    String getUsername();
//账号是否过期
    boolean isAccountNonExpired();
//账号是否锁定
    boolean isAccountNonLocked();
//证书是否过期
    boolean isCredentialsNonExpired();
//账号是否启用
    boolean isEnabled();

2.User:UserDetails默认的实现类
也可以自定义类去实现UserDetails接口,作为你的系统中的用户类,交给springsecurity使用

二、UserDetailsService接口

1.UserDetailsService:获取用户信息接口,得到UserDetails对象。一般项目中都需要自定义类来实现这个接口,从数据库中获取数据。

接口中定义的方法:
UserDetails loadUserByUsername(String username),根据用户的名称来获取用户信息

UserDetailsService接口的实现类:

1.InMemoryUserDetailsManager 实现类

在内存中管理用户

配置类代码如下:

使用InMemoryUserDetailsManager创建用户信息

@Configuration
public class ApplicationConfig {
    @Bean
    public PasswordEncoder passwordEncoder(){
        PasswordEncoder encoder = new BCryptPasswordEncoder();
        return encoder;
    }
    @Bean
    //UserDetailsService:获取用户信息接口,得到UserDetails对象
    //InMemoryUserDetailsManager:UserDetailsService的一个实现类
    public UserDetailsService userDetailsService(){
        PasswordEncoder encoder = passwordEncoder();
        InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
        manager.createUser(User.withUsername("admin")
                .password(encoder.encode("123456")).roles("ADMIN","USER").build());
        manager.createUser(User.withUsername("zhangsan")
                .password(encoder.encode("123456")).roles("USER").build());
        return manager;
    }
}

自定义安全配置

//配置类继承WebSecurityConfigurerAdapter,实现自定义安全配置
//重写configure提供web认证需要用到的信息类
public class MySecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private UserDetailsService userDetailsService = null;
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //userDetailsService对象提供用户的信息
        http.userDetailsService(userDetailsService);
    }
}
2.JdbcUserDetailsManager 实现类

JdbcUserDetailsManager:用户信息存放在数据库中,底层使用jdbcTemplate操作数据库。可以使用JdbcUserDetailsManager中的方法完成用户的管理:createUser创建用户、updateUser更新用户、deleteUser删除用户等方法。

spring-security-core-5.6.2.jarorgspringframeworksecuritycoreuserdetailsjdbcusers.ddl 中有表结构的创建语句,内容如下:

create table users(username varchar_ignorecase(50) not null primary key,password varchar_ignorecase(500) not null,enabled boolean not null);
create table authorities (username varchar_ignorecase(50) not null,authority varchar_ignorecase(50) not null,constraint fk_authorities_users foreign key(username) references users(username));
create unique index ix_auth_username on authorities (username,authority);

ApplicationConfig.java

@Configuration
public class ApplicationConfig {

    //通过Spring容器注入DataSource
    @Autowired
    private DataSource dataSource;
    //创建PasswordEncoder对象
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    //创建JdbcUserDetailsService对象
    @Bean
    public UserDetailsService jdbcUserDetailsService() {
        PasswordEncoder encoder = passwordEncoder();
        //初始数据源DataSource JdbcTemplate对象
        JdbcUserDetailsManager manager = new JdbcUserDetailsManager(dataSource);
        if (!manager.userExists("admin")){
            manager.createUser(User.withUsername("admin")
                    .password(encoder.encode("123456")).roles("ADMIN", "USER").build());
        }
        if (!manager.userExists("user")){
            manager.createUser(User.withUsername("user")
                    .password(encoder.encode("123456")).roles("USER").build());
        }
        return manager;
    }
}

MySecurityConfig.java

@EnableWebSecurity
public class MySecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private UserDetailsService userDetailsService;
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //重写方法时只是改变了数据的来源
        super.configure(http);
        http.userDetailsService(userDetailsService);
    }
}

application.properties

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/springsecurity?useUnicode=true&characterEnconding=UTF-8
spring.datasource.username=root
spring.datasource.password=123456

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/782593.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号