Spring Security使用數據庫數據完成認證–練氣後期2

寫在前面

沒錯,這篇文章還是練氣後期!但作者我相信築基指日可待!
在前一篇文章當中,我們簡單地分析了一下Spring Security的認證流程,知道了如果想要實現對自己用戶數據(賬戶、角色、權限)的讀取,需要實現UserDetailsService這個接口以及實現對應的loadUserByUsername 的方法,編寫自己的業務邏輯。並在spring security的配置文件當中指定認證使用的業務對象 。

步驟

第一步:編寫自己的User實體類

/**
 * @author 賴柄灃 [email protected]
 * @version 1.0
 * @date 2020/8/27 15:19
 */
@TableName("sys_user")
public class MyUserDO {
    @TableId
    private int id;
    private String username;
    private String password;
    private boolean status;

    getter。。。
    setter。。。
}

第二步:編寫UserDetailsServiceImpl實現UserDetailsService接口

/**
 * @author 賴柄灃 [email protected]
 * @version 1.0
 * @date 2020/8/23 9:48
 */
public class UserServiceImpl implements UserDetailsService {
 	@Autowired
    private UserDao2Impl userDaoImpl;

}

第三步:實現loadUserByUsername方法

/**使用spring security已經實現的user對象進行認證
     * @author 賴柄灃 [email protected]
     * @date 2020-08-27 15:24:28
     * @param username
     * @return org.springframework.security.core.userdetails.UserDetails
     * @throws UsernameNotFoundException
     * @version 1.0
     */
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

        // 檢驗參數
        if (username == null||username.trim().length() == 0) {
            return null;
        }

        //構造條件(我使用的是MybatisPlus)
        QueryWrapper<MyUserDO> qw = Wrappers.query();
        qw.eq("username",username);

        //從數據庫中查出自己的user對象
        MyUserDO myuser = userDaoImpl.selectOne(qw);

        //模擬獲取用戶具備的角色信息
        List<SimpleGrantedAuthority> simpleGrantedAuthorityList = new  ArrayList<>();

        simpleGrantedAuthorityList.add(new SimpleGrantedAuthority("ROLE_USER"));
        //封裝成spring security的user對象
        //注意:這裡的密碼如果不是加密村存儲的要加上"{noop}"
        User user = new User(myuser.getUsername(),myuser.getPassword(),simpleGrantedAuthorityList);
        return user;
    }

第四步:在spring security的配置文件中指定認證信息數據源為自己的UserServiceImpl

<security:authentication-provider user-service-ref="userService2Impl">
        </security:authentication-provider>

至此,spring security使用數據數據完成認證操作的編寫流程便結束了,關於其中的原理,可以查看我的上一篇文章。

如果覺得使用spring security提供的user對象不夠方便,可以讓自己編寫的User對象繼承spring security的User(之所以不推薦直接實現UserDetails接口是因為,如果直接實現該接口的話得自己編寫用戶賬戶狀態的判斷邏輯,那樣將使得工作變得更加麻煩)

補充:加密認證方式

在IOC容器中提供加密對象

<bean id="passwordEncoder"
class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>

結束

關於使用註解配置的方式較為簡單,在本文當中並未給出,後續有時間寫一寫springboot整合spring security的文章。目前是學習spring security入門一小步,所以我們的關注點應該放在spring security本身,所以剛開始的時候會涉及到很多「原始性」的操作。

代碼下載:<//github.com/code81192/art-demo/tree/master/spring-security-demo2