shiro:註解配置(五)

基於【shiro集成spring】項目改造

引入相關依賴環境

 <!--AOP的jar包-->
 <dependency>
     <groupId>org.aspectj</groupId>
     <artifactId>aspectjweaver</artifactId>
     <version>1.9.4</version>
 </dependency>

構建shiro 註解配置

在SpringMVC的配置文件中增加以下配置

<!--shiro註解配置-->
<!--調用工程中的組件-->
<bean id="lifecycleBeanPostProcessor"
      class="org.apache.shiro.spring.LifecycleBeanPostProcessor"></bean>

<!--如果發現此配置,會在當前工廠中多創建一個後處理器-->
<aop:config></aop:config>

<!--提供shiro註解組件-->
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
    <property name="securityManager" ref="securityManager"></property>
</bean>
     

註解的使用

可以註解在controller類上或者方法上,可以疊加使用

@RequiresGuest  #遊客身份

@RequiresAuthentication #必須登錄

@RequiresRoles(value = {"admin","manager"},logical = Logical.OR) #必須是admin或者mannager的角色

@RequiresPermissions("user:query") #必須有user:query的許可權

未登錄或者無許可權跳轉頁面

com\shiro\resolver\MyExceptionResolver.java

package com.shiro.resolver;

import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authz.UnauthenticatedException;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class MyExceptionResolver implements HandlerExceptionResolver {
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object o, Exception e) {
        System.out.println(e.getClass());
        ModelAndView mv = new ModelAndView();
        if(e instanceof IncorrectCredentialsException || 
                e instanceof UnknownAccountException ||
                e instanceof UnauthenticatedException){
            //跳轉到登錄介面
            mv.setViewName("redirect:/user/login");
        }
        return mv;
    }
}

註冊自定義異常類

resources\springmvc-servlet.xml

<bean class="com.shiro.resolver.MyExceptionResolver"></bean>

刪除shiro配置文件的相關配置

shiroFilter bean標籤只保留以下內容 其他的內容刪掉
resources\spring-shiro.xml

<!--shiroFilter 角色許可權校驗-->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
    <!--注入核心對象:securityManager-->
    <property name="securityManager" ref="securityManager" />
</bean>

登出

@RequestMapping("/logout")
public String logout(){
    SecurityUtils.getSubject().logout();
    return "login";
}
Tags: