1.在applicationContext.xml中配置,激活shiro的注解。
<!-- 配置shiro注解 -->
<bean
class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
depends-on="lifecycleBeanPostProcessor">
//将默认的JDK代理模式转换成CJLB代理模式
<property name="proxyTargetClass" value="true"></property>
</bean>
<bean
class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
<property name="securityManager" ref="securityManager" />
</bean>
需要注意的是因为shiro的注解是写在方法上面的,而shiro的注解是默认的情况下是通过代理对象是对接口的代理,而接口中的方法是没有注解的,所以我们需要把默认的jdk(接口代理)代理换成CJLB(继承代理),同时我们配置的事务注解也会受到影响,因此我们需要将事务的注解配置也换成CJLB的代理模式。
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>
2.在service层中的方法上添加shiro的注解。
@Service
@Transactional
public class CourierServiceImpl implements CourierService {
// 注入DAO 对象
@Autowired
private CourierRepository courierRepository;
@Override
@RequiresRoles("base")
public void save(Courier courier) {
courierRepository.save(courier);
}
}
shiro的5个常用注解如下:
- RequiresAuthentication
使用该注解标注的类,实例,方法在访问或调用时,当前Subject必须在当前session中已经过认证。
- RequiresGuest
使用该注解标注的类,实例,方法在访问或调用时,当前Subject可以是“gust”身份,不需要经过认证或者在原先的session中存在记录。
- RequiresPermissions
当前Subject需要拥有某些特定的权限时,才能执行被该注解标注的方法。如果当前Subject不具有这样的权限,则方法不会被执行。
- RequiresRoles
当前Subject必须拥有所有指定的角色时,才能访问被该注解标注的方法。如果当天Subject不同时拥有所有指定角色,则方法不会执行还会抛出AuthorizationException异常。
- RequiresUser
当前Subject必须是应用的用户,才能访问或调用被该注解标注的类,实例,方法。
3.在自定义的realm类中重写doGetAuthorizationInfo()方法,将登陆用户的授权和角色信息存入到SecurityManager中,这样SecutityManager就会将用户的权限或角色与注解所需要的进行对比,当权限不足的时候就会抛出org.apache.shiro.authz.UnauthorizedException。
@Override
// 授权
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) {
SimpleAuthorizationInfo simInfo = new SimpleAuthorizationInfo();
//根据当前登录的用户查询角色和权限信息
Subject subject = SecurityUtils.getSubject();
User user = (User) subject.getPrincipal();
//调用业务层,查询角色信息
List<Role> roles = rolesService.findByUser(user);
//为授权对象加入角色
for (Role role : roles) {
simInfo.addRole(role.getKeyword());
}
//调用业务层,查询用户权限
List<Permission> permissions=perissionService.findByUser(user);
for (Permission permission : permissions) {
simInfo.addStringPermission(permission.getKeyword());
}
return simInfo;
}