国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網站 > 幫助中心 > 正文

Spring boot整合shiro+jwt實現前后端分離

2024-07-09 22:42:40
字體:
來源:轉載
供稿:網友

本文實例為大家分享了Spring boot整合shiro+jwt實現前后端分離的具體代碼,供大家參考,具體內容如下

這里內容很少很多都為貼的代碼,具體內容我經過了看源碼和帖子加了注釋。帖子就沒用太多的內容

先下載shiro和jwt的jar包

<!-- shiro包 --><dependency>  <groupId>org.apache.shiro</groupId>  <artifactId>shiro-spring</artifactId>  <version>1.4.0</version></dependency><dependency>  <groupId>org.apache.shiro</groupId>  <artifactId>shiro-ehcache</artifactId>  <version>1.4.0</version></dependency><!--JWT依賴--><!--JWT--><dependency>  <groupId>com.auth0</groupId>  <artifactId>java-jwt</artifactId>  <version>3.4.0</version></dependency><!--JJWT--><dependency>   <groupId>io.jsonwebtoken</groupId>   <artifactId>jjwt</artifactId>   <version>0.9.0</version></dependency>

創建shiro的自定義的Realm

代碼如下:

package com.serverprovider.config.shiro.userRealm;  import com.spring.common.auto.autoUser.AutoUserModel;import com.spring.common.auto.autoUser.extend.AutoModelExtend;import com.serverprovider.config.shiro.jwt.JWTCredentialsMatcher;import com.serverprovider.config.shiro.jwt.JwtToken;import com.serverprovider.service.loginService.LoginServiceImpl;import com.util.Redis.RedisUtil;import com.util.ReturnUtil.SecretKey;import com.util.encryption.JWTDecodeUtil;import io.jsonwebtoken.Claims;import org.apache.log4j.Logger;import org.apache.shiro.authc.*;import org.apache.shiro.authz.AuthorizationInfo;import org.apache.shiro.authz.SimpleAuthorizationInfo;import org.apache.shiro.realm.AuthorizingRealm;import org.apache.shiro.subject.PrincipalCollection;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.ExceptionHandler; import java.util.HashSet;import java.util.List;import java.util.Set; public class UserRealm extends AuthorizingRealm {   private Logger logger = Logger.getLogger(UserRealm.class);    @Autowired private LoginServiceImpl loginService;    public UserRealm(){    //這里使用我們自定義的Matcher驗證接口    this.setCredentialsMatcher(new JWTCredentialsMatcher());  }   /**   * 必須重寫此方法,不然Shiro會報錯   */  @Override  public boolean supports(AuthenticationToken token) {    return token instanceof JwtToken;  }   /**   * shiro 身份驗證   * @param token   * @return boolean   * @throws AuthenticationException 拋出的異常將有統一的異常處理返回給前端   *   */  @Override  protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token)throws AuthenticationException {    /**     * AuthenticationToken     * JwtToken重寫了AuthenticationToken接口 并創建了一個接口token的變量     *  因為在filter我們將token存入了JwtToken的token變量中     *  所以這里直接getToken()就可以獲取前端傳遞的token值     */      String JWTtoken = ((JwtToken) token).getToken();    /**     * Claims對象它最終是一個JSON格式的對象,任何值都可以添加到其中     * token解密 轉換成Claims對象     */       Claims claims = JWTDecodeUtil.parseJWT(JWTtoken, SecretKey.JWTKey);          /**     *  根據JwtUtil加密方法加入的參數獲取數據     *  查詢數據庫獲得對象     *  如為空:拋出異常     *  如驗證失敗拋出 AuthorizationException     */      String username = claims.getSubject();      String password = (String) claims.get("password");      AutoModelExtend principal = loginService.selectLoginModel(username,password);      return new SimpleAuthenticationInfo(principal, JWTtoken,"userRealm");  }    @Override  protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {    SimpleAuthorizationInfo info = null;    /**     * PrincipalCollection對象     * 文檔里面描述:返回從指定的Realm 僅作為Collection 返回的單個Subject的對象,如果沒有來自該領域的任何對象,則返回空的Collection。     * 在登錄接口放入權限注解返回的錯誤信息:Subject.login(AuthenticationToken)或SecurityManager啟用'Remember Me'功能后成功自動獲取這些標識主體     * 當調用Subject.login()方法成功后 PrincipalCollection會自動獲得該對象 如沒有認證過或認證失敗則返回空的Collection并拋出異常     * getPrimaryPrincipal():返回在應用程序范圍內使用的主要對象,以唯一標識擁有帳戶。     */    Object principal = principals.getPrimaryPrincipal();    /**     * 得到身份對象     * 查詢該用戶的權限信息     */    AutoUserModel user = (AutoUserModel) principal;    List<String> roleModels = loginService.selectRoleDetails(user.getId());    try {    /**     * 創建一個Set,來放置用戶擁有的權限     * 創建 SimpleAuthorizationInfo, 并將辦好權限列表的Set放入.     */    Set<String> rolesSet = new HashSet();    for (String role : roleModels) {      rolesSet.add(role);    }    info = new SimpleAuthorizationInfo();    info.setStringPermissions(rolesSet);  // 放入權限信息  }catch (Exception e){    throw new AuthenticationException("授權失敗!");  }    return info;  }}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 郴州市| 高碑店市| 乐安县| 安溪县| 宝清县| 兰西县| 黄梅县| 潢川县| 金塔县| 双柏县| 甘德县| 定兴县| 张掖市| 双柏县| 江陵县| 土默特左旗| 新安县| 金门县| 鄱阳县| 兴业县| 辽中县| 湄潭县| 依安县| 丰都县| 陇西县| 疏勒县| 昌黎县| 山阴县| 麦盖提县| 成安县| 于田县| 南雄市| 上思县| 大安市| 武冈市| 和平区| 小金县| 博客| 临泉县| 扎囊县| 二手房|