教育行業(yè)A股IPO第一股(股票代碼 003032)

全國(guó)咨詢/投訴熱線:400-618-4000

shiro權(quán)限校驗(yàn)

更新時(shí)間:2018年08月31日14時(shí)01分 來(lái)源:傳智播客 瀏覽次數(shù):

  一、Shiro介紹

  1、Apache Shiro是一個(gè)強(qiáng)大且易用的Java安全框架,執(zhí)行身份驗(yàn)證、授權(quán)、密碼學(xué)和會(huì)話管理。

  2、使用Shiro的易于理解的API,您可以快速、輕松地獲得任何應(yīng)用程序,從最小的移動(dòng)應(yīng)用程序到最大的網(wǎng)絡(luò)和企業(yè)應(yīng)用程序

  二、Shiro體系結(jié)構(gòu)

  1、 Authentication 認(rèn)證 ‐‐‐‐ 用戶登錄,身份識(shí)別

  2、 Authorization 授權(quán) ‐‐‐ 用戶具有哪些權(quán)限、角色

  3、 Cryptography 安全數(shù)據(jù)加密

  4、 Session Management 會(huì)話管理

  5、 Web Integration web 系統(tǒng)集成

  6、 Integrations 集成其它應(yīng)用, spring、緩存框架

  三、Shiro主要運(yùn)行流程

  應(yīng)用程序 ‐‐‐ Subject ‐‐‐ SecurityManager ‐‐‐ Realm ‐‐‐ 安全數(shù)據(jù)(數(shù)據(jù)庫(kù))

  Subject介紹:

  1、Subject 是與程序進(jìn)行交互的對(duì)象,可以是人也可以是服務(wù)或者其他,通常就理解為用戶。

  2、所有 Subject 實(shí)例都被綁定到(且這是必須的)一個(gè) SecurityManager 上。當(dāng)你與一個(gè)Subject 交互時(shí),那些交互作用轉(zhuǎn)化為與 SecurityManager 交互的特定 subject 的交互作用。

  SecurityManager介紹:

  1、SecurityManager 是 Shiro的核心,初始化時(shí)協(xié)調(diào)各個(gè)模塊運(yùn)行。然而,一旦 SecurityManager協(xié)調(diào)完畢,SecurityManager 會(huì)被單獨(dú)留下,且我們只需要去操作Subject即可,無(wú)需操作SecurityManager 。

  2、當(dāng)我們正與一個(gè) Subject 進(jìn)行交互時(shí),實(shí)質(zhì)上是 SecurityManager在處理 Subject 安全操作。

  Realm介紹:

  1、Realms 擔(dān)當(dāng) Shiro 和你的應(yīng)用程序的安全數(shù)據(jù)之間的“橋梁”或“連接器”。當(dāng)它實(shí)際上與安全相關(guān)的數(shù)據(jù)如用來(lái)執(zhí)行身份驗(yàn)證(登錄)及授權(quán)(訪問控制)的用戶帳戶交互時(shí), Shiro 從一個(gè)或多個(gè)為應(yīng)用程序配置的Realm 中尋找許多這樣的東西。

  2、在這個(gè)意義上說, Realm 本質(zhì)上是一個(gè)特定安全的 DAO:它封裝了數(shù)據(jù)源的連接詳細(xì)信息,使 Shiro 所需的相關(guān)的數(shù)據(jù)可用。當(dāng)配置 Shiro 時(shí),你必須指定至少一個(gè) Realm 用來(lái)進(jìn)行身份驗(yàn)證和/或授權(quán)。 SecurityManager可能配置多個(gè) Realms,但至少有一個(gè)是必須的

  四、Shiro的使用

  1、 配置 web.xml,增加shiro的Filter

  2、在spring配置文件中,增加shiro的相關(guān)配置

  shiroFilter

  org.springframework.web.filter.DelegatingFilterProxy

  shiroFilter

  /*

  class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">

  /login.html* = anon

  /user_login.action* = anon

  /validatecode.jsp* = anon

  /css/** = anon

  /js/** = anon

  /images/** = anon

  /services/** = anon

  /pages/base/courier.html* = perms[courier:list]

  /pages/base/area.html* = roles[base]

  /** = authc

  class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">

  北京市昌平區(qū)建材城西路金燕龍辦公樓一層 電話:400-618-9090

  3、編寫realm

  public class BosRealm extends AuthorizingRealm {

  @Autowired

  private UserService userService;

  @Autowired

  private RoleService roleService;

  @Autowired

  private PermissionService permissionService;

  @Override

  // 授權(quán)...

  protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection pc) {

  System.out.println("shiro 授權(quán)管理...");

  SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();

  // 根據(jù)當(dāng)前登錄用戶 查詢對(duì)應(yīng)角色和權(quán)限

  Subject subject = SecurityUtils.getSubject();

  User user = (User) subject.getPrincipal();

  // 調(diào)用業(yè)務(wù)層,查詢角色

  List roles = roleService.findByUser(user);

  for (Role role : roles) {

  authorizationInfo.addRole(role.getKeyword());

  } /

  / 調(diào)用業(yè)務(wù)層,查詢權(quán)限

  List permissions = permissionService.findByUser(user);

  for (Permission permission : permissions) {

  authorizationInfo.addStringPermission(permission.getKeyword());

  } r

  eturn authorizationInfo;

  } @

  Override

  // 認(rèn)證...

  protected AuthenticationInfo doGetAuthenticationInfo(

  AuthenticationToken token) throws AuthenticationException {

  System.out.println("shiro 認(rèn)證管理... ");

  // 轉(zhuǎn)換token

  UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;

  // 根據(jù)用戶名 查詢 用戶信息

  User user = userService.findByUsername(usernamePasswordToken

  .getUsername());

  if (user == null) {

  // 用戶名不存在

  // 參數(shù)一: 期望登錄后,保存在Subject中信息

  北京市昌平區(qū)建材城西路金燕龍辦公樓一層 電話:400-618-9090

  五、權(quán)限控制表結(jié)構(gòu)

  // 參數(shù)二: 如果返回為null 說明用戶不存在,報(bào)用戶名

  // 參數(shù)三 :realm名稱

  return null;

  } else {

  // 用戶名存在

  // 當(dāng)返回用戶密碼時(shí),securityManager安全管理器,自動(dòng)比較返回密碼和用戶輸入密碼是否

  一致

  // 如果密碼一致 登錄成功, 如果密碼不一致 報(bào)密碼錯(cuò)誤異常

  return new SimpleAuthenticationInfo(user, user.getPassword(),

  getName());

  }

  }

  }



作者:傳智播客JavaEE培訓(xùn)學(xué)院
首發(fā):http://java.itcast.cn

0 分享到:
和我們?cè)诰€交談!