日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

shiro session 设置取不到_SpringCloud+shiro+前后端分离

發(fā)布時間:2024/9/19 javascript 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 shiro session 设置取不到_SpringCloud+shiro+前后端分离 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

采用json web token的形式解決前后端緩存問題及緩存一致性問題。具體可以看我之前寫的:JSON WEB TOKEN解決跨域、緩存一致性問題 ? 首先簡單介紹下shiro的關(guān)鍵概念 Subject:用戶主體(把操作交給SecurityManager) SecurityManager:安全管理器(關(guān)聯(lián)Realm) Realm: Shiro連接數(shù)據(jù)的橋梁 配置pom文件:

<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId><version>1.4.0</version> </dependency>

弄一個包專門寫個shiro的配置類,這里新建一個com.hykj.fiserver.env.shiro:

@Configuration public class Config {/*** 常用的過濾器:* anon:無需認(rèn)證就能訪問 * authc:必須認(rèn)證了才能訪問 user:必須擁有記住我功能才能訪問 * perms:擁有對每個資源的權(quán)限才能訪問* role:擁有某個角色權(quán)限才能訪問* @return*/@Beanpublic ShiroFilterFactoryBean getShiroFilterFactoryBean() {ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();bean.setSecurityManager(securityManager());LinkedHashMap<String, String> filterMap = new LinkedHashMap<>();// 添加一個攔截器filterMap.put("/loginAction/login", "anon");//登錄的話無需認(rèn)證就能訪問filterMap.put("/**", "authc");//攔截所有請求,有認(rèn)證才能登錄//這里沒有啟用授權(quán)過濾器,就是寫個例子//filterMap.put("/user/add", "perms[user:add]");bean.setFilterChainDefinitionMap(filterMap);// 設(shè)置登錄請求,這里是被攔截后回轉(zhuǎn)的頁面bean.setLoginUrl("/loginAction/loginError");// 設(shè)置未授權(quán)頁面,這里是未授權(quán)跳轉(zhuǎn)的頁面,沒有啟動bean.setUnauthorizedUrl("/loginAction/noauth");return bean;}/*** 安全管理器* @return*/@Beanpublic DefaultWebSecurityManager securityManager() {DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();securityManager.setSessionManager(sessionManager());securityManager.setRealm(userRealm());return securityManager;}@Beanpublic SessionManager sessionManager() {TokenSessionManager tokenSessionManager = new TokenSessionManager();return tokenSessionManager; }@Beanpublic UserRealm userRealm() {return new UserRealm();} }接下來寫UserRealm public class UserRealm extends AuthorizingRealm {private final static Log _logger = LogFactory.getLog(UserRealm.class);@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {//這里是權(quán)限認(rèn)證的地方,我項目中沒有使用shiro的權(quán)限認(rèn)證System.out.println("執(zhí)行授權(quán)");SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();// info.addStringPermission("user:add");// 拿到當(dāng)前登錄的用戶Subject subject = SecurityUtils.getSubject();UserCache currentUser = (UserCache) subject.getPrincipal();info.addStringPermission(currentUser.getOpId());return info;}@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {//subject.login(token);一定會到這里來,這里就是驗證登錄的地方UserCache user = new UserCache();user.setOpId("test");user.setUserPassword("1234");user.setUserName("test");UsernamePasswordToken userToken = (UsernamePasswordToken) token;//這里要判斷用戶名和密碼了,通常是去數(shù)據(jù)庫核對用戶名和密碼了if(!new String(userToken.getUsername()).equals(user.getUserName())) {//用戶名錯誤throw new UnknownAccountException();}if (!new String(userToken.getPassword()).equals(user.getUserPassword())) {//密碼錯誤throw new IncorrectCredentialsException(); }return new SimpleAuthenticationInfo(user, user.getUserPassword(), "");}}

token就是配置在這里了,要求前端在頭中加入token

public class TokenSessionManager extends DefaultWebSessionManager {private static final String TOKEN = "token";private static final String REFERENCED_SESSION_ID_SOURCE = "Stateless request";private final static Log _logger = LogFactory.getLog(TokenSessionManager.class);public TokenSessionManager() {super();}@Overridepublic Serializable getSessionId(ServletRequest request, ServletResponse response) {// String token = WebUtils.toHttp(request).getHeader(TOKEN);// 前端請求頭必須傳入token的值,把他的值當(dāng)做是sessionIdif (!StringUtils.isEmpty(token)) {request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE, REFERENCED_SESSION_ID_SOURCE);request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID, token);request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_IS_VALID, Boolean.TRUE);_logger.info("token=" + token);return token;} else {_logger.info("token為空");return null;// 否則按默認(rèn)規(guī)則從cookie取sessionId//return super.getSessionId(request, response);}} }

接下來進行測試,注意以下幾點: 1.UserRealm做的user 其id為test,密碼為1234,要都匹配才能過 2.登錄失敗是返回/loginAction/loginError,該接口返回一個字符串,如下代碼:

@RequestMapping(value = "/loginError", produces = "application/json; charset=utf-8")@ResponseBodypublic String loginError(@RequestHeader("token") String token) {return "hello world loginError; token = " + token;}

3./loginAction/login接口是不會被攔截的,其他請求會被攔截 測試工具:apipost 測試地址1:http://localhost:13001/FIServer/loginAction/userTest

@RequestMapping(value = "/userTest", produces = "application/json; charset=utf-8")@ResponseBodypublic String userTest() {return "hello world Test";}

因為不是loginAction/login所以被攔截了,雖然有token但還是被轉(zhuǎn)發(fā)到loginError 測試地址2:http://localhost:13001/FIServer/loginAction/login?username=testname&password=12345

@RequestMapping(value = "/login", produces = "application/json; charset=utf-8")@ResponseBodypublic String login(String username, String password, HttpServletRequest request) {// 獲取當(dāng)前的用戶Subject subject = SecurityUtils.getSubject();// 封裝用戶的登錄數(shù)據(jù)UsernamePasswordToken userToken = new UsernamePasswordToken(username, password);try {subject.login(userToken);UserCache user = (UserCache) subject.getPrincipal();System.out.println(user.getOpId());String token = _jwtTokenUtil.createToken(getJSON(user));return "登錄成功token=" + token;} catch (UnknownAccountException e) {return "用戶名錯誤";} catch (IncorrectCredentialsException e) {return "密碼錯誤";}}

很明顯因為密碼不是1234所以一定會返回用戶名錯誤

測試地址3:http://localhost:13001/FIServer/loginAction/login?username=test&password=1234

這次就沒有問題啦,注意登錄的時候是沒有token的,并且還會生產(chǎn)token返回給前端,就是圖中看不懂的那一堆字符

總結(jié)

以上是生活随笔為你收集整理的shiro session 设置取不到_SpringCloud+shiro+前后端分离的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。