SSM+shiro 關於註解@RequiresRoles不起作用的問題
阿新 • • 發佈:2018-12-17
在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>