👍SpringSecurity單體項目最佳實踐

SpringSecurity單體項目最佳實踐到這里,我們的SpringSecurity就已經完結啦 , 文章中可能有些地方不能做到全面覆蓋,視頻教程地址

  • 初始項目地址
  • 完成項目地址
1、搭建環境
  • 建議下載初始項目,跟著文章一步一步搭建 。加深對于SpringSecurity的理解 。
  • 需要將application.properties的數據庫配置,改成您自己對應的信息
  • 如若依賴問題 , 修改Idea Maven,改成自己的
  • 還需將Jdk版本改成您自己所使用的的版本 。項目使用的是JDK12
  • 數據庫腳本在完成項目中的sql文件中
2、簡單使用
  • 添加SpringSecurity依賴
  • 注:這里沒有申明版本號,是由于我們項目繼承的SpringBoot父項目,它已經為我們適配了對于的版本 。
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency>【👍SpringSecurity單體項目最佳實踐】然后啟動項目即可:
  • ? 觀察控制臺:這是SpringSecurity為我們臨時生成的密碼,默認用戶名為user

&#128077;SpringSecurity單體項目最佳實踐

文章插圖
  • ? 回到瀏覽器 , 輸入http://localhost:8080/community,由于我們此時還未登陸,會重定向到默認創建的登陸頁面中 , 這是SpringSecurity默認為我們做的 。
  • 輸入控制臺的密碼 , 即可進入到系統,

&#128077;SpringSecurity單體項目最佳實踐

文章插圖
3、自定義使用
  • 相信小伙伴們已經對SpringSecurity已經有了初步的了解,但是正常的項目中 , 不可能采用這個默認登陸頁面呀 , 這點SpringSecurity也早就想到了 。
  • 當然可以自定義登陸頁面,但是在自定義登陸頁面之前,我們需要簡單處理一下我們的實體類 。
在用戶登錄時,系統會根據用戶名,從存儲設備查找該用戶的密碼及權限等,將其組裝成一個UserDetails對象 。并用UserDetails中的數據對用戶進行認證 , 決定其輸入的用戶名/密碼是否正確 。
  • 觀察UserDetails結構
public interface UserDetails extends Serializable { Collection<? extends GrantedAuthority> getAuthorities();//權限 String getPassword();//密碼 String getUsername();//用戶名 boolean isAccountNonExpired();//賬號是否未過期 boolean isAccountNonLocked();//賬號是否未鎖定 boolean isCredentialsNonExpired();//密碼是否未過期 boolean isEnabled();//是否激活
  • 里面定義了許多關于用戶的信息 , 可以看到它是一個接口,并不能直接使用 。那么肯定就有默認的實現類,要不然我們上面的登陸功能是怎么完成的呢 。
  • ? 此項目中采用 實體類繼承它的方式來完成 。
@Datapublic class User implements UserDetails {private int id;private String username;private String password;private String salt;private String email;private int type; // 1 管理員 2普通用戶private int status;private String activationCode;private String headerUrl;private Date createTime;//權限@Overridepublic Collection<? extends GrantedAuthority> getAuthorities() {List<GrantedAuthority> permissions = new ArrayList<>();permissions.add((GrantedAuthority) () -> {switch (type) { //case 1:return "ADMIN";default:return "USER";}});return permissions;}// true 帳戶未過期@Overridepublic boolean isAccountNonExpired() {return true;}// true 帳戶未鎖定@Overridepublic boolean isAccountNonLocked() {return true;}// true 憑證未過期@Overridepublic boolean isCredentialsNonExpired() {return true;}// true 賬號是否可用@Overridepublic boolean isEnabled() {return true;}}
  • ? 定義了UserDetails之后,當然還遠遠不夠,哪個方法查詢數據庫來獲取我們的用戶信息呢?就是Security中的UserDetailsService接口

&#128077;SpringSecurity單體項目最佳實踐

文章插圖
  • ? 它肯定也有默認實現類的 , 但是我們需要查詢數據庫對應的用戶數據,所以我們還是采用自定義的方式去完成 。
@Servicepublic class UserService implements UserDetailsService {@Resourceprivate UserMapper userMapper;// 根據用戶名去查詢用戶數據public User findUserByName(String username) {return userMapper.selectByName(username);}@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {return this.findUserByName(username);}}

推薦閱讀