Shiro-權限注解


全選的注解可以放到Controller層方法上,也可以放到Service層方法上。

 

  • 常用的權限注解

  

 

  • 示例:

  在原有的基礎上添加一個Service

  

public class ShiroService {

    @RequiresRoles({"admin"})
    public void shiroServiceMethod() {
        System.out.println("Test ShiroServiceMethod, time: " + new Date());
    }

}

 

  

  在IOC 容器中進行聲明

<bean id="shiroService" class="com.java.shiro.services.ShiroService"></bean>

 

 

  添加對應的Controller 並注入bean

package com.java.shiro.realms;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import com.java.shiro.services.ShiroService;

@Controller
@RequestMapping("/shiro")
public class ShiroHandler {

    @Autowired private ShiroService shiroService; @RequestMapping("/shiroMethod") public String shiroServiceMethod(){ shiroService.shiroServiceMethod(); return "redirect:/list.jsp"; }
    
    @RequestMapping("/login")
    public String login(@RequestParam("userName") String userName,
            @RequestParam("password") String password) {

        Subject currentUser = SecurityUtils.getSubject();

        if (!currentUser.isAuthenticated()) {
            UsernamePasswordToken token = new UsernamePasswordToken(userName,
                    password);
            token.setRememberMe(true);
            try {
                currentUser.login(token);
            } catch (AuthenticationException e) {
                System.out.println("登錄失敗:" + e.getMessage());
            }
        }
        return "redirect:/list.jsp";

    }

}

 

 

  在list.jsp中添加

<a href="shiro/shiroMethod">Test ShiroMethod</a>
    <br><br>

 

  測試,

  使用admin登錄時可以正常訪問,使用user登錄時會報錯

  org.apache.shiro.authz.AuthorizationException: Not authorized to invoke method: public void com.java.shiro.services.ShiroService.shiroServiceMethod()

  對於異常可以使用 spring 的聲明式異常搞出一個錯誤頁面,使用注解 @ExceptionHandler 還有一個叫@ControllerAdvice

 

  這里有一個問題要注意:

  在Service方法上使用注解 @Transactional 即在方法開始的時候會有事務,這個時候這個Service已經是一個代理對象,

  這個是有把 權限注解加到 Service上是不好用的,會發生類型轉換異常。需要加到Controller上,因為不能夠讓Service是代理的代理。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM