亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

Spring MVC整合Shiro權限控制的方法

2024-07-14 08:40:41
字體:
來源:轉載
供稿:網友

Apache Shiro 是一個功能強大且靈活的開放源代碼安全框架,可以細粒度地處理認證 (Authentication),授權 (Authorization),會話 (Session) 管理和加密 (cryptography) 等企業級應用中常見的安全控制流程。 Apache Shiro 的首要目標是易于使用和理解。 有時候安全性的流程控制會非常復雜,對開發人員來說是件很頭疼的事情,但并不一定如此。 框架就應該盡可能地掩蓋復雜性,并公開一個簡潔而直觀的 API,從而簡化開發人員的工作,確保其應用程序安全性。這次我們聊一聊如何在 Spring Web 應用中使用 Shiro 實現權限控制。

功能

Apache Shiro 是一個具有許多功能的綜合型應用程序安全框架。 下圖為 Shiro 中的最主要的幾個功能:

 

 
Spring,MVC,權限控制,Shiro

 

Shiro 的主要目標是“應用安全的四大基石” - 認證,授權,會話管理和加密:

  1. 身份驗證:也就是通常所說的 “登錄”,為了證明用戶的行為所有者。
  2. 授權:訪問控制的過程,即確定什么用戶可以訪問哪些內容。
  3. 會話管理:即使在非 Web 應用程序中,也可以管理用戶特定的會話,這也是 Shiro 的一大亮點。
  4. 加密技術:使用加密算法保證數據的安全,非常易于使用。

架構

從整體概念上理解,Shiro 的體系架構有三個主要的概念:Subject (主體,也就是用戶),Security Manager (安全管理器)和 Realms (領域)。 下圖描述了這些組件之間的關系:

 

 
Spring,MVC,權限控制,Shiro

 

這幾大組件可以這樣理解:

  1. Subject (主體):主體是當前正在操作的用戶的特定數據集合。主體可以是一個人,也可以代表第三方服務,守護進程,定時任務或類似的東西,也就是幾乎所有與該應用進行交互的事物。
  2. Security Manager (安全管理器):它是 Shiro 的體系結構的核心,扮演了類似于一把 “傘” 的角色,它主要負責協調內部的各個組件,形成一張安全網。
  3. Realms (領域):Shiro 與應用程序安全數據之間的 “橋梁”。當需要實際與用戶帳戶等安全相關數據進行交互以執行認證和授權時,Shiro 將從 Realms 中獲取這些數據。

數據準備

在 Web 應用中,對安全的控制主要有角色、資源、權限(什么角色能訪問什么資源)幾個概念,一個用戶可以有多個角色,一個角色也可以訪問多個資源,也就是角色可以對應多個權限。落實到數據庫設計上,我們至少需要建 5 張表:用戶表、角色表、資源表、角色-資源表、用戶-角色表,這 5 張表的結構如下:

用戶表:

 

id username password
1 張三 123456
2 李四 666666
3 王五 000000

 

角色表:

 

 

id rolename
1 管理員
2 經理
3 員工

 

資源表:

 

id resname
1 /user/add
2 /user/delete
3 /compony/info

 

角色-資源表:

 

id roleid resid
1 1 1
2 1 2
3 2 3

 

用戶-角色表:

 

id userid roleid
1 1 1
2 1 2
3 1 3

 

對應的 POJO 類如下:

/** * 用戶 */public class User { private Integer id; private String username; private String password; //getter & setter...}
/** * 角色 */public class Role { private String id; private String rolename;}
/** * 資源 */public class Resource { private String id; private String resname;}
/** * 角色-資源 */public class RoleRes { private String id; private String roleid; private String resid;}
/** * 用戶-角色 */public class UserRole { private String id; private String userid; private String roleid;}

Spring 與 Shiro 整合的詳細步驟,請參閱我的博客 《 Spring 應用中整合 Apache Shiro 》 。 這里補充一下:需要提前引入 Shiro 的依賴,打開mvnrepository.com,搜索 Shiro,我們需要前三個依賴,也就是 Shiro-Core、Shiro-Web 以及 Shiro-Spring,以 Maven 項目為例,在 pom.xml 中的 <dependencies> 節點下添加如下依賴:

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

application-context.xml 中需要這樣配置 shiroFilter bean:

<!-- 配置shiro的過濾器工廠類,id- shiroFilter要和我們在web.xml中配置的過濾器一致 --><bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager"/> <!-- 登錄頁面 --> <property name="loginUrl" value="/login"/> <!-- 登錄成功后的頁面 --> <property name="successUrl" value="/index"/> <!-- 非法訪問跳轉的頁面 --> <property name="unauthorizedUrl" value="/403"/> <!-- 權限配置 --> <property name="filterChainDefinitions"> <value>  <!-- 無需認證即可訪問的靜態資源,還可以添加其他 url -->  /static/** = anon  <!-- 除了上述忽略的資源,其他所有資源都需要認證后才能訪問 -->  /** = authc </value> </property></bean>

接下來就需要定義 Realm 了,自定義的 Realm 集成自 AuthorizingRealm 類:

public class MyRealm extends AuthorizingRealm { @Autowired private UserService userService; /** * 驗證權限 */ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { String loginName = SecurityUtils.getSubject().getPrincipal().toString(); if (loginName != null) { String userId = SecurityUtils.getSubject().getSession().getAttribute("userSessionId").toString(); // 權限信息對象,用來存放查出的用戶的所有的角色及權限 SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); // 用戶的角色集合 ShiroUser shiroUser = (ShiroUser) principalCollection.getPrimaryPrincipal();  info.setRoles(shiroUser.getRoles());  info.addStringPermissions(shiroUser.getUrlSet()); return info; } return null; } /** * 認證回調函數,登錄時調用 */ protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) { String username = (String) token.getPrincipal(); User user = new User(); sysuser.setUsername(username); try { List<SysUser> users = userService.findByNames(user);  List<String> roleList= userService.selectRoleNameListByUserId(users.get(0).getId()); if (users.size() != 0) { String pwd = users.get(0).getPassword(); // 當驗證都通過后,把用戶信息放在 session 里 Session session = SecurityUtils.getSubject().getSession(); session.setAttribute("userSession", users.get(0)); session.setAttribute("userSessionId", users.get(0).getId()); session.setAttribute("userRoles", org.apache.commons.lang.StringUtils.join(roleList,","));  return new SimpleAuthenticationInfo(username,users.get(0).getPassword()); } else {  // 沒找到該用戶 throw new UnknownAccountException(); } } catch (Exception e) { System.out.println(e.getMessage()); } return null; } /** * 更新用戶授權信息緩存. */ public void clearCachedAuthorizationInfo(PrincipalCollection principals) { super.clearCachedAuthorizationInfo(principals); } /** * 更新用戶信息緩存. */ public void clearCachedAuthenticationInfo(PrincipalCollection principals) { super.clearCachedAuthenticationInfo(principals); } /** * 清除用戶授權信息緩存. */ public void clearAllCachedAuthorizationInfo() { getAuthorizationCache().clear(); } /** * 清除用戶信息緩存. */ public void clearAllCachedAuthenticationInfo() { getAuthenticationCache().clear(); } /** * 清空所有緩存 */ public void clearCache(PrincipalCollection principals) { super.clearCache(principals); } /** * 清空所有認證緩存 */ public void clearAllCache() { clearAllCachedAuthenticationInfo(); clearAllCachedAuthorizationInfo(); }}

最后定義一個用戶登錄的控制器,接受用戶的登錄請求:

@Controllerpublic class UserController { /** * 用戶登錄 */ @PostMapping("/login") public String login(@Valid User user,BindingResult bindingResult,RedirectAttributes redirectAttributes){ try {  if(bindingResult.hasErrors()){  return "login";  }  //使用權限工具進行認證,登錄成功后跳到 shiroFilter bean 中定義的 successUrl  SecurityUtils.getSubject().login(new UsernamePasswordToken(user.getUsername(), user.getPassword()));  return "redirect:index"; } catch (AuthenticationException e) {  redirectAttributes.addFlashAttribute("message","用戶名或密碼錯誤");  return "redirect:login"; } } /** * 注銷登錄 */ @GetMapping("/logout") public String logout(RedirectAttributes redirectAttributes ){ SecurityUtils.getSubject().logout(); return "redirect:login"; }}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人午夜在线影院| 欧美性xxxxx极品| 91精品免费久久久久久久久| 一区二区国产精品视频| 亚洲欧美日韩中文在线制服| 国产在线观看一区二区三区| 色老头一区二区三区| 欧美专区在线观看| 国产一区二区黑人欧美xxxx| 97色在线观看免费视频| 91精品国产777在线观看| 国产精品亚洲аv天堂网| 欧美午夜性色大片在线观看| 日韩成人在线视频观看| 韩国一区二区电影| 亚洲成人黄色网| 大荫蒂欧美视频另类xxxx| 国模精品一区二区三区色天香| 欧美亚洲国产精品| 亚洲国产精品成人精品| 一区二区国产精品视频| 欧美福利视频在线观看| 日韩综合中文字幕| 欧美成人自拍视频| 亚洲理论电影网| 久久亚洲精品毛片| 亚洲精品黄网在线观看| 欧美精品九九久久| 成人免费激情视频| 操91在线视频| 爽爽爽爽爽爽爽成人免费观看| 久久久久亚洲精品国产| 亚洲精品美女网站| 欧美中文字幕在线视频| 美女国内精品自产拍在线播放| 欧美日韩在线观看视频小说| 中文字幕亚洲激情| 国内偷自视频区视频综合| 国产精品久久久久久久久借妻| 日韩一区二区在线视频| 国产免费一区视频观看免费| 最近2019中文字幕mv免费看| 精品亚洲一区二区三区在线播放| 欧美另类xxx| 久99九色视频在线观看| 国产欧美日韩91| 久久天天躁狠狠躁老女人| 国产精品99蜜臀久久不卡二区| 久久成人精品一区二区三区| 亚洲精品美女久久久久| 日本精品性网站在线观看| 日本三级久久久| 亚洲一区二区在线| 久久久久久久久久久网站| 国产精品一区二区电影| 亚洲国产天堂久久综合网| 亚洲成年人在线播放| 亚洲一区二区久久久久久久| 日韩网站在线观看| 伊人久久精品视频| 国内精品久久久久影院 日本资源| 日韩精品一区二区视频| 亚洲第一页自拍| 日韩中文字幕国产| 97视频人免费观看| 2019精品视频| 国产亚洲福利一区| 97高清免费视频| 欧美xxxwww| 久久天天躁狠狠躁夜夜躁| 亚洲毛片在线免费观看| 色多多国产成人永久免费网站| 国产成人精品av在线| 日韩有码在线电影| 欧美精品久久久久久久免费观看| 欧美精品www在线观看| 97免费中文视频在线观看| 欧美日韩999| 亚洲第一色中文字幕| 奇米影视亚洲狠狠色| 国产精品免费小视频| 国产日韩欧美日韩大片| 成人写真福利网| 国产在线观看精品| 日韩中文字幕在线视频播放| 福利微拍一区二区| 久久五月情影视| 久久综合网hezyo| 国产精品视频永久免费播放| 91av免费观看91av精品在线| 日韩在线视频导航| 色老头一区二区三区| 91精品成人久久| 国产婷婷97碰碰久久人人蜜臀| 色一情一乱一区二区| 亚洲第一级黄色片| 午夜精品免费视频| 亚洲欧美激情视频| 538国产精品视频一区二区| 精品国产乱码久久久久酒店| 久久久影视精品| 国产精品美女www爽爽爽视频| 久久男人资源视频| 亚洲一区精品电影| 欧美中文在线免费| 成人免费观看a| 成人网页在线免费观看| 国产中文字幕日韩| 欧美夫妻性生活视频| 亚洲综合日韩在线| 亚洲欧美综合v| 伊人一区二区三区久久精品| 国产精品欧美一区二区三区奶水| 亚洲午夜未删减在线观看| 欧美日韩在线视频一区| 丝袜亚洲欧美日韩综合| 欧美成人高清视频| 欧洲永久精品大片ww免费漫画| 最新69国产成人精品视频免费| 2018中文字幕一区二区三区| 日韩高清av在线| 亚洲欧洲日产国产网站| 欧美另类第一页| 亚洲a成v人在线观看| 亚洲欧美中文字幕在线一区| 欧美日韩国产精品专区| 欧美日韩美女在线| 亚洲精品久久久久久久久| 久久久欧美精品| 国产不卡av在线| 欧美日韩精品在线视频| 国产欧美精品va在线观看| 亚洲第一视频在线观看| 国产在线精品成人一区二区三区| 一区二区成人精品| 国产99久久精品一区二区 夜夜躁日日躁| 欧美日韩不卡合集视频| 欧美极品少妇xxxxⅹ裸体艺术| 久久精品国产亚洲一区二区| 欧美怡红院视频一区二区三区| 亚洲午夜性刺激影院| 国产女同一区二区| 97国产精品久久| 亚洲精品国精品久久99热一| 亚洲第一中文字幕在线观看| 隔壁老王国产在线精品| 欧美激情亚洲综合一区| 7m第一福利500精品视频| 日韩国产精品视频| 欧美精品日韩三级| 一色桃子一区二区| 日韩中文字幕免费看| 一区二区三区回区在观看免费视频| 亚洲视频网站在线观看| 日韩中文字幕久久| 国产中文字幕亚洲| 亚洲石原莉奈一区二区在线观看| 久久午夜a级毛片| 精品福利一区二区| 91久久精品国产91久久| 欧美性资源免费| 国产精品久久久久久搜索| 美女久久久久久久久久久| 日韩人在线观看|