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

xiaoxiao2025-09-03  231

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

 

转载请注明原文地址: https://www.6miu.com/read-5035686.html

最新回复(0)