#目的
最近对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>