在ssm整合 shiro框架中,在做权限管理时,刚开始是使用代码的的方式进行权限的判断。代码如下
@RequestMapping(value="/role",method = {RequestMethod.POST}) public String test (Model model){ Subject subject = SecurityUtils.getSubject(); subject.toString(); if(subject.hasRole("admin")) { //有权限 model.addAttribute("role1", "有权限"); } else { //无权限 model.addAttribute("role1", "无"); } return "roletest"; }
之后使用准备使用注解@RequiresRoles 来进行权限管理。发现注解不起作用,查了一下需要在配置文件中加入如下配置。
<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
depends-on="lifecycleBeanPostProcessor">
<property name="proxyTargetClass" value="true" />
</bean>
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
<property name="securityManager" ref="securityManager"/>
</bean>
特别注意的是 这段注解必须写在springmvc.xml(这是springmvc的配置文件)中,我刚开始写在了spring-shiro.xml(shiro配置文件)配置文件中,导致@RequiresRoles只能在Service层起作用,而Controller层无效。
最后我的Controller层是这么写的
@RequestMapping(value="/deleteUser",method = {RequestMethod.POST})
@ResponseBody
//@RequiresRoles(value={"admin"})
public AjaxResult deleteUser(@RequestBody Integer userId){
try{
userService.deleteUser(userId);
}catch (UnauthorizedException exception){
return AjaxResult.error("删除失败");
}
return AjaxResult.success("删除成功");
}
Service层是这样
@Override
@RequiresRoles(value={"admin"})
public Integer deleteUser(Integer userId) {
return userMapper.deleteUser(userId);
}
因为当无权限访问的时候,会抛出UnauthorizedException 异常,考虑到前端页面要接收是否成功信息,我把注解写在了Service层,捕获异常就返回失败信息,反之返回成功信息。
另外:如果要访问无权限之后想要跳转到另外的页面,可以写一个自定义异常类
public class MyExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) {
System.out.println("==============异常开始=============");
//如果是shiro无权操作,因为shiro 在操作auno等一部分不进行转发至无权限url
if(ex instanceof UnauthorizedException){
System.out.println("异常处理!!!!!!!!!!!");
}
ex.printStackTrace();
System.out.println("==============异常结束=============");
return null;
}
}
springmvc.xml配置自定义异常类
<bean id="exceptionResolver" class="com.config.MyExceptionResolver"></bean>