关闭

Shiro方法/注解使用

标签: stringshiro权限注解java
528人阅读 评论(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
查看评论

shiro简单配置

注:这里只介绍spring配置模式。 因为官方例子虽然中有更加简洁的ini配置形式,但是使用ini配置无法与spring整合。而且两种配置方法一样,只是格式不一样。 涉及的jar包 Jar包名称 版本 核心包shiro-core ...
  • clj198606061111
  • clj198606061111
  • 2014-04-20 16:46
  • 100378

@RequiresPermissions 解释

@RequiresAuthentication 验证用户是否登录,等同于方法subject.isAuthenticated() 结果为true时。 @RequiresUser 验证用户是否被记忆,user有两种含义: 一种是成功登录的(subject.isAuthe...
  • kang649882
  • kang649882
  • 2015-12-01 13:26
  • 34759

我的shiro之旅-注解方式授权

相关的注解如下: The RequiresAuthentication annotation(RequiresAuthentication 注解) 要求当前Subject 已经在当前的session 中被验证通过才能被访问或调用。例如: ...
  • zhuchunyan_aijia
  • zhuchunyan_aijia
  • 2016-06-29 09:19
  • 846

Apache Shiro 注解方式授权

除了通过API方式外,Shiro 提供Java 5+注解的集合,以注解为基础的授权控制。在你可以使用Java 注释之前,你需要在你的应用程序中启用AOP 支持。 Shiro注解支持AspectJ、Spring、Google-Guice等,可根据应用进行不同的...
  • peterwanghao
  • peterwanghao
  • 2012-11-09 09:35
  • 39267

(四)shiro注解授权和jsp标签授权

1.注解式授权 @RequiresAuthentication 要求当前 Subject 已经在当前的 session 中被验证通过才能被访问或调用。 例子: @RequiresAuthentication public void updateAccount(Account userAccount...
  • a1034386099
  • a1034386099
  • 2016-12-22 16:13
  • 1272

spring整合shiro使用注解方式配置

spring整合shiro使用注解方式配置
  • amaxiaochen
  • amaxiaochen
  • 2017-08-03 16:21
  • 933

shiro的RequiresPermissions注解使用

权限控制是shiro最核心的东西 Shiro权限声明通常是使用以冒号分隔的表达式。一个权限表达式可以清晰的指定资源类型,允许的操作,可访问的数据。同时,Shiro权限表达式支持简单的通配符,可以更加灵活的进行权限设置。 下面以实例来说明权限表达式。 可查询用户数据 User:view ...
  • MOTU_
  • MOTU_
  • 2017-07-11 10:21
  • 7918

在SpringMVC中开启Shiro注解授权的正确方法

临近年关,不知道是不是大家都空下来了,有时间学习了。最近好几个好学的童鞋在问我为什么他们在Srping的配置中文件中配置好了Shiro的注解支持Bean。但是在Controller中通过注解授权的时候就是不能生效。配置如下: <bean class="org.springfra...
  • hezhipin610039
  • hezhipin610039
  • 2016-01-30 10:55
  • 7089

Shiro学习--与SpringMVC整合(数据库,Shiro注解和Shiro标签)

Shiro与springmvc整合,mysql数据库,包含脚本,shiro注解配置以及shiro标签
  • frankcheng5143
  • frankcheng5143
  • 2016-03-09 18:16
  • 17702

shiro注解权限控制-5个权限注解

shiro注解权限控制-5个权限注解Shiro共有5个注解,接下来我们就详细说说吧 RequiresAuthentication: 使用该注解标注的类,实例,方法在访问或调用时,当前Subject必须在当前session中已经过认证。RequiresGuest: 使用该注解标注的类,实例,方...
  • w_stronger
  • w_stronger
  • 2017-06-12 15:45
  • 11538
    个人资料
    • 访问:75489次
    • 积分:1253
    • 等级:
    • 排名:千里之外
    • 原创:45篇
    • 转载:1篇
    • 译文:0篇
    • 评论:56条
    文章分类
    最新评论