SpringSecurity获取数据库中的角色进行登录认证

案例代码在:https://github.com/stuchangan/springboot-study/tree/master/security-db

运行案例前请运行文件里的sql文件。

1、创建项目导入依赖

获取数据库中的信息 就需要添加数据库依赖、连接池以及mybatis。其他数据库也可以

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--mybatis-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.3</version>
        </dependency>
        <!--连接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.14</version>
        </dependency>
        <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
            <version>5.1.44</version>
        </dependency>

2、修改pom文件

使用mybatis时需要用到mapper.xml文件在springboot中静态文件需要放在resources文件夹下

一般编码习惯将mapper接口文件以及xml文件放在一起(java文件夹下),这时就需要在pom文件中添加下面配置,将下面配置写在<build><build/>里面 这样springboot就会去扫描java文件夹下的静态文件

<resources>
    <resource>
        <directory>src/main/java</directory>
        <includes>
            <include>**/*.xml</include>
        </includes>
    </resource>
    <resource>
        <directory>src/main/resources</directory>
    </resource>
</resources>

3、创建实体类

创建user实体类和role实体类,其中user实体类要实现UserDetails接口

user类:

public class User implements UserDetails {
    private Integer id;
    private String username;
    private String password;
    private Boolean enabled;
    private Boolean locked;
​
    private List<Role> roles;
​
    public List<Role> getRoles() {
        return roles;
    }
​
    public void setRoles(List<Role> roles) {
        this.roles = roles;
    }
​
    public Integer getId() {
        return id;
    }
​
    public void setId(Integer id) {
        this.id = id;
    }
​
    @Override
    public String getUsername() {
        return username;
    }
​
    @Override
    public boolean isAccountNonExpired() {
        return true;
    }
​
    @Override
    public boolean isAccountNonLocked() {
        return !locked;
    }
​
    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }
​
    @Override
    public boolean isEnabled() {
        return enabled;
    }
​
    public void setUsername(String username) {
        this.username = username;
    }
​
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        List<SimpleGrantedAuthority> authorities = new ArrayList<>();
        for (Role role : roles) {
            //在springsecurity中角色是以 ROLE_ 开头的
            authorities.add(new SimpleGrantedAuthority("ROLE_"+role.getName()));
        }
        return authorities;
    }
    @Override
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
​
    public void setEnabled(Boolean enabled) {
        this.enabled = enabled;
    }
​
    public void setLocked(Boolean locked) {
        this.locked = locked;
    }
}
​

role类:

public class Role{
    private Integer id;
    private String name;
    private String nameZh;
​
    public Integer getId() {
        return id;
    }
​
    public void setId(Integer id) {
        this.id = id;
    }
​
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
​
    public String getNameZh() {
        return nameZh;
    }
​
    public void setNameZh(String nameZh) {
        this.nameZh = nameZh;
    }
}

 

4、security配置

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
​
    @Autowired
    UserService userService;
​
    @Bean
    PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }
​
    //springSecurity中的角色传递
    @Bean
    RoleHierarchy roleHierarchy(){
        RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
        //表示ROLE_dba的权限大于ROLE_admin,ROLE_admin的权限大于ROLE_user
        String hierarchy = "ROLE_dba > ROLE_admin \n ROLE_admin > ROLE_user";
        roleHierarchy.setHierarchy(hierarchy);
        return roleHierarchy;
    }
​
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userService);
    }
​
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/dba/**").hasRole("dba")//配置每个角色可以访问的路径
                .antMatchers("/admin/**").hasRole("admin")
                .antMatchers("/user/**").hasRole("user")
                .anyRequest().authenticated()
                .and()
                .formLogin()
                .permitAll()
                .and()
                .csrf().disable();
    }
}

5、mapper层编写

UserMapper.java:

@Mapper
public interface UserMapper {
​
    //根据用户名查询user对象
    User loadUserByUsername(String username);
​
    //根据用户id查询用户具有的角色
    List<Role> getUserRolesById(Integer id);
}

UserMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
​
<mapper namespace="com.javaboy.securitydb.mapper.UserMapper">
    <select id="loadUserByUsername" resultType="com.javaboy.securitydb.entity.User">
        select * from user where username=#{username}
    </select>
    <select id="getUserRolesById" resultType="com.javaboy.securitydb.entity.Role">
        select * from role where id in (select rid from user_role where uid=#{id})
    </select>
</mapper>

 

6、service编写

UserService要实现UserDetailsService接口

@Service
public class UserService implements UserDetailsService {
    @Autowired
    private UserMapper userMapper;
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userMapper.loadUserByUsername(username);
        if (user == null){
            throw new UsernameNotFoundException("用户不存在!");
        }
        user.setRoles(userMapper.getUserRolesById(user.getId()));
        return user;
    }
}

7、controller层

三个接口分别表示不同的角色可以访问的不同接口

@RestController
public class UserController { 
    @GetMapping("/dba/hello")
    public String dba(){
        return "hello dba";
    }
    @GetMapping("/admin/hello")
    public String admin(){
        return "hello admin";
    }
    @GetMapping("/user/hello")
    public String user(){
        return "hello user";
    }
​
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring Security可以连接各种类型的数据库,包括关系型数据库和非关系型数据库。连接数据库的方式可以使用JDBC或者ORM框架,如Hibernate、MyBatis等。在Spring Security,可以使用JdbcUserDetailsManager或者JdbcDaoImpl来实现用户认证和授权,也可以使用自定义的UserDetailsService和UserDetails来实现。在配置文件,需要配置数据源和相应的SQL语句来实现数据库连接。 ### 回答2: Spring Security连接数据库是一种常见的身份验证和授权的方式。可以使用Spring Security的JDBC模块来实现该功能。 首先,需要在项目添加Spring Security和相关的依赖。 然后,在Spring的配置文件配置数据源,例如可以使用Spring提供的内存数据库H2,也可以使用其他的数据库,例如MySQL、PostgreSQL等。配置数据源时,需提供数据库的连接信息,例如数据库的URL、用户名和密码等。 接下来,在配置文件配置Spring Security认证和授权方式。一般情况下,可以使用基于数据库认证方式,即用户的信息存储在数据库。可以定义一个用户表,包含用户名、密码和角色等字段。然后,可以使用JdbcTemplate等工具类操作数据库,例如查询用户信息,验证用户名和密码是否匹配等。 在Spring Security的配置,可以通过定义UserDetailsService的实现类来获取用户信息。该实现类可以通过JdbcTemplate查询数据库,返回一个UserDetails对象,包含用户的详细信息。然后,Spring Security会自动根据该对象进行身份验证和授权操作。 在认证和授权过程,可以通过其他的功能来增强安全性,例如使用密码加密算法对用户密码进行加密,使用密码策略来限制密码的复杂度,使用记住我功能来提供用户的便利登录等。 最后,可以通过编写控制器和页面等来实现登录页面和权限管理等功能,例如根据用户的角色来显示不同的页面内容。 总结来说,Spring Security连接数据库是一种可靠的身份验证和授权方式,可以通过配置数据源和实现UserDetailsService来获取用户信息,实现对数据库的连接和操作。这样,系统可以根据数据库的用户信息进行身份验证和授权操作,提供安全的访问控制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值