`
leman_zk
  • 浏览: 23947 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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

    博客分类:
  • SSH
 
阅读更多

     今天我想给我的方法调用加上权限管理,比如说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"/>

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

分享到:
评论
4 楼 hezhoujun 2014-03-17  
楼主,我最近也在看这个,不知道你现在研究的怎么样了。 我试了下 用注解的方式,但是当tomcat一启动的时候, 配置文件中的<context:component-scan .. 会自动变成<bean></bean>.....有点诡异.....也许是为了给它创造了代理类才这样还是...我也搞不清
3 楼 alexqdjay 2013-12-24  
alexqdjay 写道
那是因为你component-scan声明在mvc的context容器里,而security声明在全局的context里,所以影响不到,初始化都不是一起的


把你的component-scan弄到外面的 spring配置文件中就ok了
2 楼 alexqdjay 2013-12-24  
那是因为你component-scan声明在mvc的context容器里,而security声明在全局的context里,所以影响不到,初始化都不是一起的
1 楼 pyzheng 2012-04-08  
看我的例子吧   我也是跟着别人的例子搞了一天多。我有源码的和一些说明的。

相关推荐

    Spring_Security-3.0.1_中文自学教程.pdf

    ### Spring Security 3.0.1 中文自学教程知识点概览 #### 一、Spring Security 简介 ##### 1.1 Spring Security 是什么? Spring Security 是一款强大的、高度可定制的身份验证与授权框架。它能够帮助开发者保护...

    Spring Security 4.1 中文文档@www.java1234.com.pdf

    Spring Security是一套广泛使用的安全框架,由Spring社区提供支持,主要用于在Spring应用中提供安全控制功能。其主要职责是提供认证(登录验证)和授权(访问控制)。Spring Security提供了一整套完整的、灵活的安全...

    spring3.0mvc自学教程ppt+注解教程+注解实例+springmybatis教程+项目实例+中文api (老师的心血)从入门到项目实战

    3. **注解实例**:通过实例,你可以学习如何使用这些注解来简化代码,比如使用`@RequestMapping`处理不同的URL请求,`@Autowired`自动装配bean,以及`@Service`和`@Component`在组件扫描中的作用。 4. **Spring与...

    spring 入门教程(spring-reference)

    这份PDF教程简洁明了,内容精炼,非常适合初次接触Spring的开发者进行自学。 Spring是Java企业级应用开发中的一个关键框架,它提供了丰富的功能,包括依赖注入(Dependency Injection,DI)、面向切面编程(Aspect-...

    Spring5自学讲义

    1. **IoC(控制反转)**:IoC容器负责管理对象的生命周期,通过XML配置或注解方式定义对象及其依赖关系,从而实现对象的自动装配。 2. **AOP(面向切面编程)**:AOP允许开发者定义“切面”,这些切面可以在运行时被...

    Java Web整合开发完全自学手册:Struts+Hibernate+Spring+Eclipse源码

    《JavaWeb整合开发完全自学手册》介绍如何整合Struts+Hibernate+Spring+Eclipse进行J2EE开发,所有实例都基于MyEclipseIDE开发,引领读者快速进入基于JavaWeb的J2EE应用领域。《JavaWeb整合开发完全自学手册》主要...

    SPRING技术内幕+深入解析SPRING架构与设计 55M(下载地址)

    - Spring与其他流行框架(如Struts、Hibernate等)的对比分析。 2. **Spring核心容器深入解析**: - BeanFactory与ApplicationContext的实现机制。 - Bean的生命周期管理,包括初始化、销毁等过程。 - 自定义...

    SpringCloud项目实战各组件源代码案例

    springcloud生产者与消费者项目实战案例 Spring Cloud 中断路器 Circuit Breaker的应用 配置 Spring Cloud Config Server Spring Cloud Config使用Oracle数据库作为后端配置存储 Spring Cloud Config + Spring Cloud...

    springlive(共11章)

    - ORM集成:探讨Spring与Hibernate、MyBatis等ORM框架的整合,实现数据持久化。 5. **第五章:Spring MVC** - MVC架构:理解Model-View-Controller模式,以及Spring MVC如何实现这一模式。 - Controller处理请求...

    spring框架技术自学指导

    5. **Spring与数据库交互**:Spring支持多种数据访问技术,包括JDBC、Hibernate、MyBatis等。它提供了一种声明式事务管理,使得事务处理更加简单。此外,Spring Data项目则进一步简化了数据访问层的编写,如JPA和...

    小马spring视频源码

    6. **Spring Security**:对于涉及到安全性的话题,源代码可能包含Spring Security的配置和认证授权示例。 通过深入研究这些源代码,开发者可以更好地理解Spring框架的工作原理,提升自己的技能,并且能够应用到...

    Spring自学编程代码

    自学Spring所产生的代码,包含IOC、AOP的入门以及进阶,Spring与数据库(MySQL)的交互。(该资源不仅包含我写的代码,一切Spring、aspect、jdbc等所需jar包都俱全,项目导入就能跑起来)

    Spring-Professional-Certification-Study-Guide.pdf

    指南中涵盖了诸多与Spring框架相关的主题,并为考生准备了大量资源供学习参考,旨在帮助考生全面而深入地掌握Spring技术。 首先,文档强调了在Spring Professional认证考试准备过程中,阅读提供的材料是最佳的学习...

    spring mvc 自学教程

    【Spring MVC 自学教程】 Spring MVC 是一个基于 Model-View-Controller(MVC)设计模式的轻量级 Web 开发框架。它使开发者能够轻松地将业务逻辑、数据处理和用户界面分离,从而提高代码的可维护性和复用性。 **...

    blog项目自学.7z

    博客项目自学教程主要涵盖了SpringBoot、Thymeleaf、PageHelper和SpringSecurity四个核心技术和框架。下面将分别详细解释这些技术及其在项目中的应用。 **SpringBoot** SpringBoot是由Pivotal团队提供的全新框架,...

    spring底层的学习之路

    总的来说,"Spring学习之路"资料包将带你走过Spring框架的基本知识,从Spring的核心原理到实战Spring MVC项目,是一条完整的自学路径。希望你在学习过程中不断积累,提升自己的Java Web开发能力。

    spring-sample:Spring 自学示例项目

    在项目中,你可以看到如何定义Bean,以及如何通过@Autowired注解实现自动装配。 2. **面向切面编程(Aspect-Oriented Programming,AOP)**:Spring对AOP的支持使得我们能够将关注点分离,比如日志记录、事务管理等...

    spring揭秘自学用 王福强 高清版

    Spring的诞生是为了应对早期J2EE开发中的一些问题,这些问题主要源于对J2EE平台服务的过度依赖和滥用,导致了复杂度增加和开发效率降低。 Spring作为一个轻量级框架,它提倡依赖注入(Dependency Injection,DI)和...

    spring-mvc 自学文档(我自己总结的)

    本自学文档主要介绍了Spring MVC的基本概念和核心组件,适合初学者掌握其基本工作原理。 1. DispatcherServlet(前端控制器) DispatcherServlet是Spring MVC的入口点,它充当着整个框架的前端控制器角色。在web....

    Mybatis 最小依赖jar 不集成spring 自学练习版本

    在这个“最小依赖jar不集成spring”的自学练习版本中,我们将专注于Mybatis的核心功能,不涉及与Spring框架的整合。 首先,让我们了解Mybatis的基本构成: 1. **Mybatis核心Jar**:这个版本包含Mybatis框架的核心...

Global site tag (gtag.js) - Google Analytics