同步操作将从 小牛肉/cs-wiki 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
只需要添加MySQL数据库的驱动包以及配置好数据源和JPA,代码不必做任何改变,就可以将基于内存数据库的身份认证和角色授权的代码转换为 MySQL 数据库的存储方式
在pom.xml
文件中去掉 hsqldb 的依赖,然后添加 mysql 的依赖:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
注意 JPA 中 Hibernate 的版本 与 MySQL 版本对应
创建数据库 spring-security 就可以了,啥也不用做
在 application.properties
文件中添加配置信息:
spring.datasource.url = jdbc:mysql://localhost:3306/spring-security
spring.datasource.username = root
spring.datasource.password = root
spring.datasource.driverClassName = com.mysql.jdbc.Driver
# Specify the DBMS
spring.jpa.database = MYSQL
# Show or not log for each sql query
spring.jpa.show-sql = true
# Hibernate ddl auto (create, create-drop, update)
spring.jpa.hibernate.ddl-auto = create-drop
启动应用程序,成功的话可以看到数据库已经自动添加了以下数据:
按照之前的流程测试下,结果是一样的。至此,我们并没有做过多的编码,就轻松的从内存数据库转换到MySQL数据库,这就是框架给我们提供的便利。
到这里基本的流程都是没有问题的,但是我们发现数据库的密码都是明文显示的,,那么数据库的密码怎么加密保存呢?其实也很简单,在初始化用户信息的时候,就进行加密即可,具体的操作如下:
修改初始化用户信息类 DataInit
,注入PasswordEncoder
,使用 PasswordEncoder
的 encode
方法对密码进行加密:
@Service
public class DataInit {
@Autowired
private UserInfoRepository userInfoRepository;
@Autowired
private PasswordEncoder passwordEncoder;
@PostConstruct
public void dataInit() {
UserInfo admin = new UserInfo();
admin.setUsername("admin");
admin.setPassword(passwordEncoder.encode("123"));
admin.setRole(Role.admin);
userInfoRepository.save(admin);
UserInfo user = new UserInfo();
user.setUsername("user");
user.setPassword(passwordEncoder.encode("123"));
user.setRole(Role.normal);
userInfoRepository.save(user);
}
}
在添加用户的时候,已经加密了,那么在 loadUserByUsername
方法中返回的 UserDetails
就不需要再加密了,修改为如下:
@Service
public class CustomUserDetailService implements UserDetailsService{
@Autowired
private UserInfoService userInfoService;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
System.out.println("CustomUserDetailService.loadUserByUsername()");
//通过username获取用户信息
UserInfo userInfo = userInfoService.findByUsername(username);
if(userInfo == null) {
throw new UsernameNotFoundException("not found");
}
// 定义权限列表.
List<GrantedAuthority> authorities = new ArrayList<>();
// 用户所拥有的权限 注意:必须"ROLE_"开头
authorities.add(new SimpleGrantedAuthority("ROLE_"+userInfo.getRole().name()));
User userDetails = new User(userInfo.getUsername(),userInfo.getPassword(),authorities);
return userDetails;
}
}
启动应用,查看数据库的用户信息:
此时看到的数据库中的密码已经是加密的了,访问下如下的地址:
http://127.0.0.1:8080/helloUser
输入账号 user/123 看是否可以正常登录吧。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。