zoukankan      html  css  js  c++  java
  • 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是代理的代理。

  • 相关阅读:
    JS中every()和some()的用法
    Git 各指令的本质
    vue登录3D效果
    vue打包后反编译到源代码(reverse-sourcemap)
    CSS Modules
    有了 HTTP 协议,为什么还需要 Websocket?
    微信小程序的实现原理
    JS
    微信小程序的发布流程
    中国地图
  • 原文地址:https://www.cnblogs.com/wq3435/p/6271381.html
Copyright © 2011-2022 走看看