1. 程式人生 > >shiro角色許可權驗證

shiro角色許可權驗證

shiro提供了對外驗證角色和許可權的API,都是通過Subject來呼叫。

@Test
	public void auth(){
		Subject subject=SecurityUtils.getSubject();
		UsernamePasswordToken token=new UsernamePasswordToken("zhang", "123");
		subject.login(token);
		if(subject.hasRole("role1")){
			System.out.println("have role");
		}else{
			System.out.println("not have role");
		}
		if(subject.isPermitted("user:update")){
			System.out.println("have permitted");
		}else{
			System.out.println("not have permitted");
		}
	}

當我們呼叫subject驗證使用者是否擁有某個角色.許可權時,Subject會委託給org.apache.shiro.mgt.SecurityManager
public boolean isPermitted(String permission) {
        return hasPrincipals() && securityManager.isPermitted(getPrincipals(), permission);
    }
public boolean hasRole(String roleIdentifier) {
        return hasPrincipals() && securityManager.hasRole(getPrincipals(), roleIdentifier);
    }
SecurityManager會委託給org.apache.shiro.authz.Authorizer
public abstract class AuthorizingSecurityManager extends AuthenticatingSecurityManager {


    private Authorizer authorizer;

    
    public AuthorizingSecurityManager() {
        super();
        this.authorizer = new ModularRealmAuthorizer();
    }
    public boolean hasRole(PrincipalCollection principals, String roleIdentifier) {
        return this.authorizer.hasRole(principals, roleIdentifier);
    }

許可權的驗證都是委託給Authorizer介面的定義如下:

public interface Authorizer{
	
	
    boolean isPermitted(PrincipalCollection principals, String permission);

    
    boolean isPermitted(PrincipalCollection subjectPrincipal, Permission permission);

    
    boolean[] isPermitted(PrincipalCollection subjectPrincipal, String... permissions);

   
    boolean[] isPermitted(PrincipalCollection subjectPrincipal, List<Permission> permissions);

   
    boolean isPermittedAll(PrincipalCollection subjectPrincipal, String... permissions);

   
    boolean isPermittedAll(PrincipalCollection subjectPrincipal, Collection<Permission> permissions);

    
    void checkPermission(PrincipalCollection subjectPrincipal, String permission) throws AuthorizationException;

   
    void checkPermission(PrincipalCollection subjectPrincipal, Permission permission) throws AuthorizationException;

   
    void checkPermissions(PrincipalCollection subjectPrincipal, String... permissions) throws AuthorizationException;

   
    void checkPermissions(PrincipalCollection subjectPrincipal, Collection<Permission> permissions) throws AuthorizationException;

    
    boolean hasRole(PrincipalCollection subjectPrincipal, String roleIdentifier);

    
    boolean[] hasRoles(PrincipalCollection subjectPrincipal, List<String> roleIdentifiers);

   
    boolean hasAllRoles(PrincipalCollection subjectPrincipal, Collection<String> roleIdentifiers);

    
    void checkRole(PrincipalCollection subjectPrincipal, String roleIdentifier) throws AuthorizationException;

    
    void checkRoles(PrincipalCollection subjectPrincipal, Collection<String> roleIdentifiers) throws AuthorizationException;

    
    void checkRoles(PrincipalCollection subjectPrincipal, String... roleIdentifiers) throws AuthorizationException;
    

}
org.apache.shiro.authz.ModularRealmAuthorizer是SecurityManager的預設實現,直接取Realm中找,找到了就返回true。
 public boolean hasRole(PrincipalCollection principals, String roleIdentifier) {
        assertRealmsConfigured();
        for (Realm realm : getRealms()) {
            if (!(realm instanceof Authorizer)) continue;
            if (((Authorizer) realm).hasRole(principals, roleIdentifier)) {
                return true;
            }
        }
        return false;
    }
public boolean isPermitted(PrincipalCollection principals, Permission permission) {
        assertRealmsConfigured();
        for (Realm realm : getRealms()) {
            if (!(realm instanceof Authorizer)) continue;
            if (((Authorizer) realm).isPermitted(principals, permission)) {
                return true;
            }
        }
        return false;
    }

結合第一章的身份認證,如果我們自定義realm,realm要實現的介面,做的事情很多,shiro提供了org.apache.shiro.realm.AuthorizingRealm,為我們實現好了這些介面的方法,我們只要提供許可權資訊和使用者認證資訊即可。demo如下
public class CustomRealm extends AuthorizingRealm {

	/**
	 * 獲取許可權資訊
	 * author wenyi
	 * time: 2017年10月9日上午9:23:43
	 */
	@Override
	protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
		//登入的時候放入的使用者資訊
		User user=(User) principals.getPrimaryPrincipal();
		//虛擬碼,根據使用者資訊查到角色和許可權
		//.....
		
		
		SimpleAuthorizationInfo info=new SimpleAuthorizationInfo();
		//新增角色
		String role="role1";
		info.addRole(role);
		//新增許可權
		String permission="user:update";
		info.addStringPermission(permission);
		return info;
	}

	/**
	 * 
	 * 進行登入認證
	 * author wenyi
	 * time: 2017年10月9日上午9:24:18
	 */
	@Override
	protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
		UsernamePasswordToken userToken=(UsernamePasswordToken)token;
		String userName=userToken.getUsername();
		//虛擬碼,根據token取到對應的使用者資訊,shiro只會比較密碼是否正確,不會再比較使用者名稱
		User user=new User();
		user.setUserName(userName);
		//虛擬碼,這個是根據token查到的密碼,shiro會比較登入的密碼與這個密碼是否一致
		String password="from db";
		return new SimpleAuthenticationInfo(user, password, getName());
	}

}


相關推薦

shiro角色許可權驗證

shiro提供了對外驗證角色和許可權的API,都是通過Subject來呼叫。 @Test public void auth(){ Subject subject=SecurityUtils.getSubject(); UsernamePasswordToken t

shiro許可權驗證問題

/**  * Copyright &copy; 2012-2014 <a href="https://www.mycomm.com/mycommcrm">MyComm CRM</a> All rights reserved.  */ package com.thi

Shiro框架從入門到實戰程式碼(五)springMVC結合Shiro實現許可權驗證

LoginController @Controller public class LoginController { @RequestMapping("gologin.html") p

Shiro後臺實現驗證許可權

  今天發現一個問題:使用shiro的時候,雖然隱藏掉了一些選單,但是當我們通過get請求直接訪問選單的時候還是會訪問到,也就是shiro可以在介面實現隱藏一些資訊,但是沒有真正的根據許可權碼驗證請求,於是自己在後臺實現驗證。    需求:有許可權(許可權碼是systemmanager:settings)

SSM框架整合Apache Shiro,實現安全登入驗證許可權驗證功能

第一部分 Apache Shiro的簡介  1、什麼是 apache shiro : Apache Shiro是一個功能強大且易於使用的Java安全框架,提供了認證,授權,加密,和會話管理 如同 spring security 一樣都是是一個許可權安全框架,但是與Spri

(2)shiro角色資源許可權

一般在web系統許可權設計中,一般分為三個維度,使用者,角色,資源,一個使用者可以擁有多個角色,比如說可以是老師,也可以是班主任,一個角色也可以擁有多個資源。 比如老師同時擁有檢視班級學生和批改作業的資源,如果一個使用者有老師這個角色,那麼就代表他擁有了檢視班級學生和批改作業的兩個資源許可權。 因為只

ASP.NET MVC:窗體身份驗證角色許可權管理示例

前言   本來使用Forms Authentication進行使用者驗證的方式是最常見的,但系統地闡明其方法的文章並不多見,網上更多的文章都是介紹其中某一部分的使用方法或實現原理,而更多的朋友則發文詢問如何從頭到尾完整第實現使用者的註冊、登入。因此,Anders Liu在這

轉:ASP.NET MVC:窗體身份驗證角色許可權管理示例

前言   本來使用Forms Authentication進行使用者驗證的方式是最常見的,但系統地闡明其方法的文章並不多見,網上更多的文章都是介紹其中某一部分的使用方法或實現原理,而更多的朋友則發文詢問如何從頭到尾完整第實現使用者的註冊、登入。因此,Anders Liu在這一系列文章中計劃通過一個實際

許可權驗證框架Shiro

許可權驗證框架Shiro: Shiro簡介 什麼是Shiro: shiro是一個強大易用的Java安全框架,提供了認證,授權,加密,回話管理等功能; 認證(Authentication):使用者身份識別,常被稱為使用者“登入”,判斷使用者是否登陸,如果未登陸,則攔截其請求

簡單三步理解Shiro許可權驗證/登入

通過請求方式來判斷是初始請求還是驗證請求 一、 @RequestMapping(value ="/login", method =RequestMethod.GET)publicString sho

ASP.NET 基於FORMS驗證的目錄角色許可權

一個系統中經常有多種身份的使用者,往往要根據其身份來控制目錄的訪問許可權。asp.net提供了forms驗證,能夠輕易的在配置檔案中設定使用者對目錄的訪問許可權. 但是我在使用過程中,發現針對角色的控制並不是那麼容易,通過在網上查詢資料,終於解決這個問題。下面將主要的注意事項

springboot+shiro+mybatis實現角色許可權控制

背景 spring+spirngmvc+shiro的整合已經有很多了,之前的專案中也用過,但是最近想在springboot中使用shiro這樣,其他專案需要的時候只需要把它依賴進來就可以直接使用,至於shiro的原理其他的blog都有很多介紹。這裡只講幾個重點

shiro許可權驗證標籤

例項: spring-shiro.xml 1 2 3 /admin/repairType/index = roles["ROLE_ADMIN"] /admin/user=roles["ROLE_ADMIN"] /admin/complaint/lis

shiro---擴充套件RBAC使用者角色許可權設計方案

RBAC(Role-Based Access Control,基於角色的訪問控制),就是使用者通過角色與許可權進行關聯。簡單地說,一個使用者擁有若干角色,每一個角色擁有若干許可權。這樣,就構造成“使用者-角色-許可權”的授權模型。在這種模型中,使用者與角色之間,角色與許可權之

使用使用maven專案實現Java安全框架Shiro的內建Realm:IniRealm進行登陸許可權驗證

1.我們先建一個maven專案,如圖: 2.在pom.xml中新增如下依賴: <dependencies> <dependency> <groupId>org.apache.shiro</groupId>

使用者角色許可權系統完整設計(基於shiro

一:shiro簡介 1.1:shiro可以幫助我們完成:認證,授權,加密,會話管理,與web整合,快取等。shiro不會去維護使用者沒維護許可權。這些需要我們自己設計提供,然後通過想應的介面注入給shiro。 1.2:shiro的API簡單介紹 Aut

shiro 使用者許可權管理(2)-----註冊md5加密,登入驗證

register.jsp註冊頁面: <body> <form action="<%=basePath%>/main/add" method="post"> <ul> <

菜鳥學習shiro之用配置檔案實現登入,身份和許可權驗證2

Maven的和第一篇,一樣直接去複製使用 這篇部落格和上一篇沒有多大的區別,區別之處就是上一篇沒有實現許可權認證,將在這一篇中實現,這裡我們使用四郎給我們提供的內建類IniRealm,來實現登入,身份

ASP.NET MVC4 自定義許可權角色驗證

開發系統的時候,兩個基本的模組是少不了的,那就是 —— 身份驗證 和許可權。上一篇文章我們介紹了ASP.NET MVC 身份驗證,今天我們來說一下許可權管理。 1. 需求: 當普通使用者 進行編輯、刪除操作時,系統拒絕使用者的訪問,若訪問為非同步操作

shiro許可權驗證

上次介紹了shiro的一些理論知識,這次用一些程式碼來具體實現角色驗證與登入驗證 首先介紹一下使用的環境: SpringBoot + Mybatis + Shiro 新增的類 ShiroRe