1. 程式人生 > >SSM+shiro 關於註解@RequiresRoles不起作用的問題

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>