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);
}
SecurityManager會委託給org.apache.shiro.authz.Authorizerpublic boolean hasRole(String roleIdentifier) { return hasPrincipals() && securityManager.hasRole(getPrincipals(), roleIdentifier); }
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 © 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