博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringBoot安全管理 ——模块2:Spring Security 基于数据库的认证
阅读量:3947 次
发布时间:2019-05-24

本文共 5231 字,大约阅读时间需要 17 分钟。

Spring Security 基于数据库的认证

上一篇所介绍的认证数据都是直接定义在内存中,而在真实项目中,用户的信息肯定都是存放在数据库中,因此如何从数据库中获取数据进行认证,本篇将介绍如何基于数据库做认证

1.设计数据库

首先需要设计一个数据库,里面有三张表,分别是用户表,角色表,用户角色关联表
user 表字段如下:
在这里插入图片描述
role 表字段如下:
在这里插入图片描述
user_role 表字段如下:
在这里插入图片描述
2.创建项目
首先在pom.xml文件中添加如下依赖:

org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-security
org.mybatis.spring.boot
mybatis-spring-boot-starter
1.3.2
mysql
mysql-connector-java
runtime
com.alibaba
druid
1.1.0

3.配置数据库,在application.properties中配置数据库的基本信息:

spring.datasource.type=com.alibaba.druid.pool.DruidDataSourcespring.datasource.username=rootspring.datasource.password=123456spring.datasource.url=jdbc:mysql:///security

4.创建实体类

这里分别创建角色类和用户表对应的实体类,如下所示:

public class Role implements Serializable {
private Integer id; private String name; private String nameZh; //省略 getter/setter }//user表所引用的包import org.springframework.security.core.GrantedAuthority;import org.springframework.security.core.authority.SimpleGrantedAuthority;import org.springframework.security.core.userdetails.UserDetails;import java.util.ArrayList;import java.util.Collection;import java.util.List;public class User implements UserDetails {
private Integer id; private String username; private String password; private Boolean enabled; private Boolean locked; private List
roles; @Override //获取当前对象所具有的角色信息 public Collection
getAuthorities() {
List
authorities = new ArrayList<>(); for (Role role : roles) {
authorities.add(new SimpleGrantedAuthority(role.getName())); } return authorities; } @Override //获取当前用户对象的密码 public String getPassword() {
return password; } @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; } //省略 getter/setter }

代码解释:用户实体类需要实现 UserDetails 接口,并实现该接口中的7个方法,如表所示:

方法名 解释
getAuthorities() 获取当前对象所具有的角色信息
getPassword() 获取当前用户对象的密码
getUsername() 获取当前对象的用户名
isAccountNonExpired() 当前账户是否未过期
isAccountNonLocked() 当前账户是否未锁定
isCredentialsNonExpired() 当前账户密码是否未过期
isEnabled() 当前账户是否可用

5.创建UserService,代码如下:

import com.example.demo.dao.UserMapper;import com.example.demo.entity.User;import org.springframework.security.core.userdetails.UserDetails;import org.springframework.security.core.userdetails.UserDetailsService;import org.springframework.security.core.userdetails.UsernameNotFoundException;import org.springframework.stereotype.Service;import javax.annotation.Resource;@Servicepublic class UserService implements UserDetailsService {
@Resource UserMapper userMapper; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = userMapper.loadUserByUsername(username); if (user == null) {
throw new UsernameNotFoundException("账户不存在"); } user.setRoles(userMapper.getUserRolesByUid(user.getId())); return user; }}

代码解释:定义 UserService 实现 UserDetailsService 接口,并实现此接口的loadUserByUsername 方法,此方法参数就是用户登陆时输入的用户名,通过用户名去数据库查找用户,此方法将在用户登录时自动调用

UserMapper 代码如下:

@Mapperpublic interface UserMapper {
User loadUserByUsername(String username); List
getUserRolesByUid(Integer id);}

UserMapper.xml 代码如下:

6.配置 Spring Security,代码如下

@Configurationpublic class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired UserService userService; @Bean PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder(); } @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userService); } @Override protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests() .antMatchers("/admin/**").hasRole("admin") .antMatchers("/db/**").hasRole("dba") .antMatchers("/user/**").hasRole("user") .anyRequest().authenticated() .and() .formLogin().loginProcessingUrl("/login").permitAll() .and() .csrf().disable(); }}

这里大部分代码同上篇没有多大改变,唯一不同之处就是没有配置用户,而是将刚刚创建好的 UserService 配置到 AuthenticationManagerBuilder 中

配置完后,接下来就可以创建 Controller 进行测试了。

转载地址:http://iiqwi.baihongyu.com/

你可能感兴趣的文章
APP第三方登录实现步骤
查看>>
iOS-数据存储方式介绍
查看>>
KVO & KVC 比较 - KVC
查看>>
iOS-tableView联动
查看>>
iOS--Masonry解决 tableViewCell 重用时约束冲突
查看>>
git 与 svn 的主要区别!
查看>>
iOS-截屏,从相册选择图片,制作磨砂效果图片
查看>>
iOS-截取字符串中两个指定字符串中间的字符串
查看>>
数据库-数据库操作(使用FMDB)
查看>>
swift-计算型属性和存储型属性的区别
查看>>
FMDB介绍以及在 swift 中的数据库操作
查看>>
iOS运行时机制(附Demo演练)
查看>>
iOS-利用运行时给分类添加属性
查看>>
整理的最新WebSHell (php过狗一句话,过狗菜刀,2016过狗一句话,2016php免杀一句话)
查看>>
2016年11月整理的最新php免杀一句话木马, 2017php免杀一句话(php过狗一句话,过狗菜刀,2016过狗一句话,2016php免杀一句话,php过waf一句话)
查看>>
坑:ADO连数据库服务器地址要加端口号
查看>>
宽字符串输出问题
查看>>
将整数转换为宽字符串
查看>>
在类中定义enum实现整数常量功能
查看>>
VS2008下编译MFC报平台版本低解决办法
查看>>