SSM+shiro 关于注解@RequiresRoles不起作用的问题

在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>

猜你喜欢

转载自blog.csdn.net/qq_31608981/article/details/83383113