2015-03-01 15:36

Spring Security 存取控制表示式

常用内建表示式

ps: 定義在 SecurityExpressionRoot

表示式說明
hasRole('role')當前的 User 擁有指定的 Role 就回傳 true
hasAnyRole('role1', 'role2')當前的 User 擁有任一個 Role 就回傳 true
principal當前的 User 的 Principal 物件
authentication當前的 User 的 Authentication 物件
permitAll總是為 true
denyAll總是為 false
isAnonymous()當前的 User 是匿名登入就回傳 true
isRememberMe()當前的 User 是透過 remember-me 登入就回傳 true
isAuthenticated()當前的 User 不是匿名登入就回傳 true
isFullyAuthenticated()當前的 User 不是匿名登入或 remember-me 登入就回傳 true



在方法執行前的驗證


驗證 User 角色
  1. @PreAuthorize("hasRole('ROLE_USER')") 
  2. public void create(Contact contact); 

驗證參數值是否等於 User 名稱
  1. @PreAuthorize("#contact.name == authentication.name") 
  2. public void doSomething(Contact contact); 

驗證 User 角色以及來源 IP 區間
  1. @PreAuthorize("hasRole('admin') and hasIpAddress('192.168.1.0/24')") 
  2. public void doSomething(Contact contact); 



在方法內的驗證


取得角色驗證
  1. @RequestMapping("/index") 
  2. public void index(HttpServletRequest request) { 
  3.    System.out.println(request.isUserInRole("ROLE_USER")); 
  4.  
  5.    if (request.isUserInRole("admin")) { 
  6.        System.out.println("is admin"); 
  7.    } 
  8. } 



在 JSP 的驗證


取得 User 名稱
  1. <sec:authentication property="name"/> 
  2. <sec:authentication property="principal.username"/> 

取得 User IP
  1. <sec:authentication property="details.remoteAddress"/> 

取得 User SessionId
  1. <sec:authentication property="details.sessionId"/> 

驗證角色為 admin 才顯示
  1. <sec:authorize access="hasRole('admin')"> 
  2.    <div>is admin</div> 
  3. </sec:authorize> 

驗證角色為 admin 存入變數 isAdmin
  1. <sec:authorize var="isAdmin" access="hasRole('admin')" /> 
  2. <c:if test="isAdmin"> 
  3.    <div>is admin</div> 
  4. </c:if> 


參考自:15. Expression-Based Access Control

0 回應: