真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Springboot中怎么使用shiro和jwt實現(xiàn)前后端分離

今天就跟大家聊聊有關Springboot中怎么使用shiro和jwt實現(xiàn)前后端分離,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

創(chuàng)新互聯(lián)建站是一家專注于網(wǎng)站制作、成都網(wǎng)站建設與策劃設計,封丘網(wǎng)站建設哪家好?創(chuàng)新互聯(lián)建站做網(wǎng)站,專注于網(wǎng)站建設10多年,網(wǎng)設計領域的專業(yè)建站公司;建站業(yè)務涵蓋:封丘等地區(qū)。封丘做網(wǎng)站價格咨詢:028-86922220

先下載shiro和jwt的jar包

 org.apache.shiro  shiro-spring  1.4.0  org.apache.shiro  shiro-ehcache  1.4.0  com.auth0  java-jwt  3.4.0   io.jsonwebtoken   jjwt   0.9.0

創(chuàng)建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 拋出的異常將有統(tǒng)一的異常處理返回給前端   *   */  @Override  protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token)throws AuthenticationException {    /**     * AuthenticationToken     * JwtToken重寫了AuthenticationToken接口 并創(chuàng)建了一個接口token的變量     *  因為在filter我們將token存入了JwtToken的token變量中     *  所以這里直接getToken()就可以獲取前端傳遞的token值     */      String JWTtoken = ((JwtToken) token).getToken();    /**     * Claims對象它最終是一個JSON格式的對象,任何值都可以添加到其中     * token解密 轉(zhuǎn)換成Claims對象     */       Claims claims = JWTDecodeUtil.parseJWT(JWTtoken, SecretKey.JWTKey);          /**     *  根據(jù)JwtUtil加密方法加入的參數(shù)獲取數(shù)據(jù)     *  查詢數(shù)據(jù)庫獲得對象     *  如為空:拋出異常     *  如驗證失敗拋出 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'功能后成功自動獲取這些標識主體     * 當調(diào)用Subject.login()方法成功后 PrincipalCollection會自動獲得該對象 如沒有認證過或認證失敗則返回空的Collection并拋出異常     * getPrimaryPrincipal():返回在應用程序范圍內(nèi)使用的主要對象,以唯一標識擁有帳戶。     */    Object principal = principals.getPrimaryPrincipal();    /**     * 得到身份對象     * 查詢該用戶的權限信息     */    AutoUserModel user = (AutoUserModel) principal;    List roleModels = loginService.selectRoleDetails(user.getId());    try {    /**     * 創(chuàng)建一個Set,來放置用戶擁有的權限     * 創(chuàng)建 SimpleAuthorizationInfo, 并將辦好權限列表的Set放入.     */    Set rolesSet = new HashSet();    for (String role : roleModels) {      rolesSet.add(role);    }    info = new SimpleAuthorizationInfo();    info.setStringPermissions(rolesSet);  // 放入權限信息  }catch (Exception e){    throw new AuthenticationException("授權失敗!");  }    return info;  }}

這個授權方法遇到的坑比較少,就是在最終驗證的時候網(wǎng)上很照抄過來的帖子一點都沒有驗證就粘貼賦值,在這里嚴重吐槽。

在使用jwt最為token而取消shiro傳統(tǒng)的session時候,我們的需要重寫shiro的驗證接口 CredentialsMatcher,在 自定義的realm

中我們加入我們重寫的驗證方法,在調(diào)用SimpleAuthenticationInfo()方法進行驗證的時候,shiro就會使用重寫的驗證接口。

此處為大坑。

貼上代碼如下:

import com.spring.common.auto.autoUser.extend.AutoModelExtend;import org.apache.log4j.Logger;import org.apache.shiro.authc.AuthenticationInfo;import org.apache.shiro.authc.AuthenticationToken;import org.apache.shiro.authc.credential.CredentialsMatcher;   /** * CredentialsMatcher * 接口由類實現(xiàn),該類可以確定是否提供了AuthenticationToken憑證與系統(tǒng)中存儲的相應帳戶的憑證相匹配。 * Shiro 加密匹配 重寫匹配方法CredentialsMatcher 使用JWTUtil 匹配方式 */public class JWTCredentialsMatcher implements CredentialsMatcher {   private Logger logger = Logger.getLogger(JWTCredentialsMatcher.class);   /**   * Matcher中直接調(diào)用工具包中的verify方法即可   */  @Override  public boolean doCredentialsMatch(AuthenticationToken authenticationToken, AuthenticationInfo authenticationInfo) {    String token = (String) ((JwtToken)authenticationToken).getToken();    AutoModelExtend user = (AutoModelExtend)authenticationInfo.getPrincipals().getPrimaryPrincipal();    //得到DefaultJwtParser    Boolean verify = JwtUtil.isVerify(token, user);    logger.info("JWT密碼效驗結(jié)果="+verify);    return verify;  }}

shiro的配置項 ShiroConfiguration代碼如下:

import com.serverprovider.config.shiro.shiroSysFile.JwtFilter;import com.serverprovider.config.shiro.userRealm.UserRealm;import org.apache.log4j.Logger;import org.apache.shiro.mgt.DefaultSessionStorageEvaluator;import org.apache.shiro.mgt.DefaultSubjectDAO;import org.apache.shiro.mgt.SecurityManager;import org.apache.shiro.mgt.SessionStorageEvaluator;import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;import org.apache.shiro.spring.web.ShiroFilterFactoryBean;import org.apache.shiro.web.mgt.DefaultWebSecurityManager;import org.apache.shiro.web.mgt.DefaultWebSessionStorageEvaluator; import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration; import javax.servlet.Filter;import java.util.*; @Configurationpublic class ShiroConfiguration {   private Logger logger = Logger.getLogger(ShiroConfiguration.class);     @Bean("shiroFilter")  public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {    ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();    shiroFilterFactoryBean.setSecurityManager(securityManager);    //攔截器    Map filterChainDefinitionMap = new LinkedHashMap();    // 配置不會被攔截的鏈接 順序判斷    filterChainDefinitionMap.put("/login/**", "anon");    // 添加自己的過濾器并且取名為jwt    Map filterMap = new HashMap();    filterMap.put("jwt", new JwtFilter());    shiroFilterFactoryBean.setFilters(filterMap);    //

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部