#目的html
最近對shiro的學習,有個習慣就是學習了就記錄下來,以便之後翻出來看看,分享一下,若是說得不對,也有網友幫忙指正 那麼此次是對註解這塊進行學習 看這章以前必須學會shiro的基礎配置,shiro的配置也很簡單,我找時間把配置的也寫一篇出來java
|註解|描述 |- |hasRole(String roleName)
|返回true,當前Subject(登錄工號)有該角色權限,false,沒有 |hasRoles(List<String> roleNames)
|返回true,至少在集合中存在一個角色權限,false一個都沒有 |hasAllRoles(Collection<String> roleNames)
|返回true,當前工號擁有列表全部角色,不然返回false 使用例子:git
Subject currentUser = SecurityUtils.getSubject(); if (currentUser.hasRole("administrator")) { //有權限處理業務邏輯 } else { //沒權限處理業務邏輯 }
|註解|描述 |- |checkRole(String roleName)
|若當前Subject(工號)有該角色不拋出異常,若沒有拋出AuthorizationException
|checkRoles(Collection<String> roleNames)
|若當前Subject(工號)擁有全部該集合角色不拋出異常,若沒有拋出AuthorizationException
|checkRoles(String... roleNames)
|同上,只不過採用java5的新特性 使用例子:github
Subject currentUser = SecurityUtils.getSubject(); //檢查是否有該bankTeller權限,若沒有拋出異常,繼續往下執行 currentUser.checkRole("bankTeller"); openBankAccount();
看以前能夠看看官方的描述:Persmission Permission在某種程度上能夠理解爲字符串,爲一個權限編號便可,也提供了字符串的權限校驗 |註解|描述 |- |isPermitted(Permission p)/isPermitted(String perm)
|返回true,當前Subject(工號)擁有該權限,不然false |isPermitted(List<Permission> perms)/isPermitted(String... perms)
|有集合中的一個以上,即返回true,不然false |isPermittedAll(Collection<Permission> perms)/isPermittedAll(String... perms)
|有集合中的全部權限,才返回true,不然false 使用例子1:spring
Subject currentUser = SecurityUtils.getSubject(); if (currentUser.isPermitted("printer:print:laserjet4400n")) { //作有權限操做 } else { //作無權限操做 }
使用例子2:apache
Subject currentUser = SecurityUtils.getSubject(); //能夠理解爲Permission就是一個字符串 //權限配置Shiro提供了好幾種給咱們,這個咱們在受權的時候咱們再給你們講講 Permission p = new WildcardPermission("printer:print:laserjet4400n"); if (currentUser.isPermitted(p) { //作有權限操做 } else { //作無權限操做 }
這個跟角色的是同樣的意思,就不解釋了 |註解|描述 |- |checkPermission(Permission p)
| | |checkPermission(String perm)
| | |checkPermissions(Collection<Permission> perms)
| | |checkPermissions(String... perms)
|ide
註解都會拋出異常,但這個異常不須要咱們來刻意處理,shiro會來處理,跳轉到登錄界面或者其餘學習
是否通過認證或者登錄,若沒有的話會拋出異常UnauthenticatedException
使用例子:ui
@RequiresAuthentication public void updateAccount(Account userAccount) { //處理業務邏輯 ... }
上面的例子至關於:code
public void updateAccount(Account userAccount) { if (!SecurityUtils.getSubject().isAuthenticated()) { throw new AuthorizationException(...); } //處理業務邏輯 ... }
未認證或者叫未登錄,可能在remember me狀態下,不然拋出異常UnauthenticatedException
使用例子:
@RequiresGuest public void signUp(User newUser) { //處理業務邏輯 ... }
上面的例子至關於:
public void signUp(User newUser) { Subject currentUser = SecurityUtils.getSubject(); PrincipalCollection principals = currentUser.getPrincipals(); if (principals != null && !principals.isEmpty()) { //known identity - not a guest: throw new AuthorizationException(...); } //Subject is guaranteed to be a 'guest' here ... }
檢查是否有該權限,沒有拋出異常AuthorizationException
使用例子:
@RequiresPermissions("account:create") public void createAccount(Account account) { //處理業務邏輯 ... }
上面的例子至關於:
public void createAccount(Account account) { Subject currentUser = SecurityUtils.getSubject(); if (!subject.isPermitted("account:create")) { throw new AuthorizationException(...); } //處理業務邏輯 ... }
檢查是否有該角色,沒有拋出異常AuthorizationException
使用例子:
@RequiresRoles("administrator") public void deleteUser(User user) { //處理業務邏輯 ... }
上面的例子至關於:
public void deleteUser(User user) { Subject currentUser = SecurityUtils.getSubject(); if (!subject.hasRole("administrator")) { throw new AuthorizationException(...); } //處理業務邏輯 ... }
這個恰好跟**@RequiresGuest相反,這個必須通過認證,或者從rememberme進行登錄,這個沒有RequiresAuthentication**嚴格但相似,不然拋出異常AuthorizationException
使用例子:
@RequiresUser public void updateAccount(Account account) { //處理邏輯 ... }
上面的例子至關於:
public void updateAccount(Account account) { Subject currentUser = SecurityUtils.getSubject(); PrincipalCollection principals = currentUser.getPrincipals(); if (principals == null || principals.isEmpty()) { //no identity - they're anonymous, not allowed: throw new AuthorizationException(...); } //處理業務邏輯 ... }
使用註解須要配置一些東西 shiro提供了好幾種配置支持:
因爲筆者能力有限,瞭解甚淺,只介紹怎麼配置spring securityManager
就不介紹怎麼配置了,另外一章再說這個,那麼spring 怎麼配置呢
spring 配置,固然也能夠看看官網怎麼說,http://shiro.apache.org/spring.html
<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/> <!-- Enable Shiro Annotations for Spring-configured beans. Only run after --> <!-- the lifecycleBeanProcessor has run: --> <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor"/> <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"> <property name="securityManager" ref="securityManager"/> </bean>