关闭

Shiro方法/注解使用

标签: stringshiro权限注解java
292人阅读 评论(0) 收藏 举报
分类:

目的

最近对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>
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:36755次
    • 积分:832
    • 等级:
    • 排名:千里之外
    • 原创:44篇
    • 转载:1篇
    • 译文:0篇
    • 评论:42条
    文章分类
    最新评论