Shiro方法/注解使用

#目的

最近对shiro的学习,有个习惯就是学习了就记录下来,以便以后翻出来看看,分享一下,如果说得不对,也有网友帮忙指正 那么这次是对注解这块进行学习 看这章之前必须学会shiro的基础配置,shiro的配置也很简单,我找时间把配置的也写一篇出来


Shiro方法大全

Role-Based Authorization(角色验证)

|注解|描述 |- |hasRole(String roleName)|返回true,当前Subject(登陆工号)有该角色权限,false,没有 |hasRoles(List<String> roleNames)|返回true,至少在集合中存在一个角色权限,false一个都没有 |hasAllRoles(Collection<String> roleNames)|返回true,当前工号拥有列表所有角色,否则返回false 使用例子:

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的新特性 使用例子:

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:

Subject currentUser = SecurityUtils.getSubject();

if (currentUser.isPermitted("printer:print:laserjet4400n")) {
    //做有权限操作
} else {
    //做无权限操作
}

使用例子2:

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)|


Shiro注解大全

注解都会抛出异常,但这个异常不需要我们来刻意处理,shiro会来处理,跳转到登陆界面或者其他

@RequiresAuthentication

描述/例子

是否经过认证或者登陆,若没有的话会抛出异常UnauthenticatedException 使用例子:

@RequiresAuthentication
public void updateAccount(Account userAccount) {
    //处理业务逻辑
    ...
}

上面的例子相当于:

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>

转载于:https://my.oschina.net/u/1983041/blog/739441

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值