一、实现方式
有两种方式,第一种是在的shiro的配置文件(applicationContext-shiro.xml)中(即过滤器),第二种是通过注解
二、代码实现
1、配置文件
在配置文件的<property name="filterChainDefinitions">标签下的<value>标签中,通过配置perms过滤器来控制访问,如需要控制部门管理的访问,可通过如下设置。等号之前的表示需要控制的路径,等号之后表示需要“部门管理”权限。如果无权限会根据配置文件中的<property name="unauthorizedUrl" value="/index2.jsp" />标签跳转到指定的页面
/sysadmin/deptAction* = perms["部门管理"]
而“部门管理”这个权限是根据在自定义的类“AuthRealm”中授权方法(doGetAuthorizationInfo)里面,通过SimpleAuthorizationInfo对象的addStringPermission方法增加的权限名称。
2、注解
由于Struts2框架和shiro框架存在冲突的问题,权限配置不能在web层进行,所以可以在service层配置。如在deptAction里面需要通过deptService对象的相关方法来获取需要的资源,所以可以在该方法上添加@RequiresPermissions注解来控制。
代码如下:
@Override
@RequiresPermissions(value="部门管理")
public Page<Dept> findPage(Specification<Dept> spec, Pageable pageable) {
return deptDao.findAll(spec, pageable);
}
如果需要调用findPage方法,则需要“部门管理”权限,否则会抛异常
注意:注解的方式对于UserService无法控制,因为在自定义的AuthRealm类中的AuthenticationInfo方法需要UserService来获取数据库中的密码。也就是说只要是在AuthRealm类中被AuthenticationInfo使用的,都无法通过注解来控制
三、区别
配置文件的方式无权限时会跳转到指定的页面,注解则会直接抛异常。而且配置文件比较集中,好管理,所以建议使用配置文件的形式。
建议写一个action,配置控制权限,否则到最后写的话会很累