公司工作需要使用自建的云平台,虽然我是嵌入式工程师但是因为人手不足(主要还是建站的人走了,没人会Java)所以交由我来维护。
这次有了新需求,需要进行权限的分类和管理,由于原先的代码已经经了好几手了(心累啊!!),我需要保持原先的结构不动的情况下加入这些功能,那么原先的方式已经不满足需求了。
查阅了资料以后,决定直接使用UserDetailsService的形式对原先页面进行改造。
我们原先的spring-security.xml有如下代码:
<authentication-manager erase-credentials="false">
<authentication-provider>
<jdbc-user-service
data-source-ref="dataSource"
users-by-username-query="select username,password,1 as enabled from sys_user where username=?"
authorities-by-username-query="select u.username, r.name as role from sys_user u,sys_role_user ur, sys_role r where u.id=ur.Sys_User_id and r.id = ur.Sys_Role_id and u.username= ? "
/>
</authentication-provider>
</authentication-manager>
这里的authentication-provider是使用了直接使用jdbc对数据库进行读取,但是在商业项目中我们不能将数据库结构直接暴露,所以我们要采用UserDetailsService的形式对于用户数据进行管理,同时也方便后期对于权限等地方的操作。
我们这里使用自定义的UserDetailsService来代替原先对数据库的直接操作:
<authentication-manager erase-credentials="false">
<authentication-provider user-service-ref="myUserDetailsService">
</authentication-provider>
</authentication-manager>
然后我们在后端,对myUserDetailsService这个类需要进行具体的设计,但是在此之前,我们需要自定义好UserDetails。
package com.hzmsc.scada.entity;
import java.util.Collection;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
public class User implements UserDetails{
/**
* @title: User
* @author: zza
* @date: 2020/3/9 17:05
* @description: User用于权限验证和获取个人信息等方面,要注意和Users类的区别
*/
private int id;
private String username;
private String password;
private boolean enabled;
private Collection<? extends GrantedAuthority> authorities;
public