Shiro方法/註解使用

#目的html

最近對shiro的學習,有個習慣就是學習了就記錄下來,以便之後翻出來看看,分享一下,若是說得不對,也有網友幫忙指正 那麼此次是對註解這塊進行學習 看這章以前必須學會shiro的基礎配置,shiro的配置也很簡單,我找時間把配置的也寫一篇出來java


Shiro方法大全

Role-Based Authorization(角色驗證)

|註解|描述 |- |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 {
    //沒權限處理業務邏輯
}

Role Assertions(角色檢查)

|註解|描述 |- |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();

Permission-Based Authorization(權限校驗)

看以前能夠看看官方的描述: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 {
    //作無權限操做
}

Permission Assertions(權限檢查)

這個跟角色的是同樣的意思,就不解釋了 |註解|描述 |- |checkPermission(Permission p)| | |checkPermission(String perm)| | |checkPermissions(Collection<Permission> perms)| | |checkPermissions(String... perms)|ide


Shiro註解大全

註解都會拋出異常,但這個異常不須要咱們來刻意處理,shiro會來處理,跳轉到登錄界面或者其餘學習

@RequiresAuthentication

描述/例子

是否通過認證或者登錄,若沒有的話會拋出異常UnauthenticatedException 使用例子:ui

@RequiresAuthentication
public void updateAccount(Account userAccount) {
    //處理業務邏輯
    ...
}

上面的例子至關於:code

public void updateAccount(Account userAccount) {
    if (!SecurityUtils.getSubject().isAuthenticated()) {
        throw new AuthorizationException(...);
    }
    
    //處理業務邏輯
    ...
}

@RequiresGuest

描述/例子

未認證或者叫未登錄,可能在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
    ...
}

@RequiresPermissions

描述/例子

檢查是否有該權限,沒有拋出異常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(...);
    }
    
    //處理業務邏輯
    ...
}

@RequiresRoles

描述/例子

檢查是否有該角色,沒有拋出異常AuthorizationException

使用例子:

@RequiresRoles("administrator")
public void deleteUser(User user) {
    //處理業務邏輯
    ...
}

上面的例子至關於:

public void deleteUser(User user) {
    Subject currentUser = SecurityUtils.getSubject();
    if (!subject.hasRole("administrator")) {
        throw new AuthorizationException(...);
    }
    
    //處理業務邏輯
    ...
}

@RequiresUser

描述/例子

這個恰好跟**@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>
相關文章
相關標籤/搜索