【自学Spring Security】之@PreAuthorize与自动装配冲突的问题

     今天我想给我的方法调用加上权限管理,比如说index.jsp上有三个链接

<p><a href="users/add.do">add</a></p>
<p><a href="users/dell.do">dell</a></p>
<p><a href="users/list.do">list</a></p>

     具有ROLE_USER的用户只能访问第一个链接,具有ROLE_ADMIN的用户可以访问所有链接,如果想通过路径来进行权限控制,则必须将所有请求地址全部罗列出来,那个工作量就大了。

     进入正题,先写一个控制器,我的程序是基于Spring MVC的,所以就写一个POJO类,奖赏Controller注解完成。

@Controller
@RequestMapping("/users")
public class UserController
{
    @Autowired
    protected UserService userService;

    @RequestMapping("/add")
    public ModelAndView add()
    {
        ModelAndView modelAndView=new ModelAndView("result");
        userService.addUser();
        modelAndView.addObject("message","add成功");
        return modelAndView;
    }

    @RequestMapping("/dell")
    public ModelAndView del()
    {
        ModelAndView modelAndView=new ModelAndView("result");
        userService.delUser();
        modelAndView.addObject("message","del成功");
        return modelAndView;
    }

    @RequestMapping("/list")
    public ModelAndView list()
    {
        ModelAndView modelAndView=new ModelAndView("result");
        List<String> users=userService.listUser();
        System.out.println("size="+users.size());
        modelAndView.addObject("users",users);
        return modelAndView;
    }
}

    UserService接口定义如下:

public interface UserService
{
    @PreAuthorize("hasRole('ROLE_USER')")
    public void addUser();

    @PreAuthorize("hasRole('ROLE_ADMIN')")
    public void delUser();

    @PreAuthorize("hasRole('ROLE_ADMIN')")
    @PostFilter("filterObject.length()<5")
    public List<String> listUser();
}

    UserService接口的实现类:

@Component("userService")
public class UserServiceImpl implements UserService
{
    @Override
    public void addUser()
    {
        System.out.println("add user...");
    }

    @Override
    public void delUser()
    {
        System.out.println("del user...");
    }

    @Override
    public List<String> listUser()
    {
        System.out.println("list user");
        List<String> list=new LinkedList<String>();
        list.add("zhangsan");
        list.add("lisi");
        list.add("wangwu");
        return list;
    }
}

   编写一个结果返回页面result.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title></title>
</head>
<body>
<h2>${message}</h2>
<hr>
<c:forEach var="name" items="${users}">${name}<br></c:forEach>
</body>
</html>
 

    测试程序发现不管具有ROLE_USER的用户也可以访问del和list方法,真实百思不得其解,没办法只有查看Spring Security自带的示例程序,费了很大劲才在网上搜索到contact的源代码,发现service层Spring没有使用注解,而是在配置文件中配置bean元素,于是把@Component去掉,添加一个bean

<bean id="userService" class="com.leman.service.UserServiceImpl"/>

   试了一下,发现权限控制起作用了,这是怎么回事呢,我也没有弄明白,期待高手解答。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值