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是代理的代理。

 

转载于:https://www.cnblogs.com/wq3435/p/6271381.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值