原文: https://howtodoinjava.com/spring-security/xml-config-based-method-level-spring-security-using-protect-pointcut/

在方法级别安全性的先前示例中,我们使用@PreAuthorize注解添加了安全性。 注解也是在任何方法上增加安全性的好方法和快速方法。 但是有一个问题,它将您的应用程序代码紧紧地耦合到 Spring 上。 至少在理论上就最佳做法而言,这都是不推荐的。 推荐的方法是将所有此类安全性定义添加到 xml 配置文件中。 这样,您始终可以更改实现而无需触碰源代码。

总览

在此示例中,我使用了典型的员工管理屏幕。 有两个基本操作,ADDDELETE

  1. 添加要求经过身份验证的用户具有"ROLE_USER""ROLE_ADMIN"
  2. 删除受到更多保护,并且需要管理员访问权限,即仅允许ROLE_ADMIN删除用户。

我在应用程序中有两个用户,即adminlokeshadmin用户同时具有“ ROLE_USER”和“ ROLE_ADMIN”角色,但另一个用户lokesh仅具有“ ROLE_USER”访问权限。

applicationContext.xml

  1. <user-service>
  2. <user name="lokesh" password="password" authorities="ROLE_USER" />
  3. <user name="admin" password="password" authorities="ROLE_USER,ROLE_ADMIN" />
  4. </user-service>

上面的安全配置将允许两个用户都添加用户,但是只有admin才能够删除用户。

让我们看一下示例应用程序中的主要功能点。

使用保护切入点的基于 XML 的 Spring Security

完整的 XML 配置如下所示:

applicationContext.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans:beans xmlns="http://www.springframework.org/schema/security"
  3. xmlns:beans="http://www.springframework.org/schema/beans"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  7. http://www.springframework.org/schema/security
  8. http://www.springframework.org/schema/security/spring-security-3.0.3.xsd">
  9. <global-method-security>
  10. <protect-pointcut expression="execution(* com.howtodoinjava.service.*Impl.add*(..))" access="ROLE_USER"/>
  11. <protect-pointcut expression="execution(* com.howtodoinjava.service.*Impl.delete*(..))" access="ROLE_ADMIN"/>
  12. </global-method-security>
  13. <http auto-config="false" use-expressions="true">
  14. <intercept-url pattern="/login" access="permitAll" />
  15. <intercept-url pattern="/logout" access="permitAll" />
  16. <intercept-url pattern="/accessdenied" access="permitAll" />
  17. <intercept-url pattern="/**" access="hasRole('ROLE_USER')" />
  18. <form-login login-page="/login" default-target-url="/list" authentication-failure-url="/accessdenied" />
  19. <logout logout-success-url="/logout" />
  20. </http>
  21. <authentication-manager alias="authenticationManager">
  22. <authentication-provider>
  23. <user-service>
  24. <user name="lokesh" password="password" authorities="ROLE_USER" />
  25. <user name="admin" password="password" authorities="ROLE_USER,ROLE_ADMIN" />
  26. </user-service>
  27. </authentication-provider>
  28. </authentication-manager>
  29. <beans:bean id="employeeDAO" class="com.howtodoinjava.dao.EmployeeDaoImpl" />
  30. <beans:bean id="employeeManager" class="com.howtodoinjava.service.EmployeeManagerImpl" />
  31. </beans:beans>

应用安全性的管理器类

EmployeeManagerImpl.java

  1. package com.howtodoinjava.service;
  2. import java.util.List;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.stereotype.Service;
  5. import org.springframework.transaction.annotation.Transactional;
  6. import com.howtodoinjava.dao.EmployeeDAO;
  7. import com.howtodoinjava.entity.EmployeeEntity;
  8. @Service
  9. public class EmployeeManagerImpl implements EmployeeManager {
  10. @Autowired
  11. private EmployeeDAO employeeDAO;
  12. @Override
  13. @Transactional
  14. public void addEmployee(EmployeeEntity employee) {
  15. employeeDAO.addEmployee(employee);
  16. }
  17. @Override
  18. @Transactional
  19. public List<EmployeeEntity> getAllEmployees() {
  20. return employeeDAO.getAllEmployees();
  21. }
  22. @Override
  23. @Transactional
  24. public void deleteEmployee(Integer employeeId) {
  25. employeeDAO.deleteEmployee(employeeId);
  26. }
  27. public void setEmployeeDAO(EmployeeDAO employeeDAO) {
  28. this.employeeDAO = employeeDAO;
  29. }
  30. }

我跳过了其余代码,因为它与以前的使用注解的安全示例完全相同。 另外,如果需要引用任何内容,则可以下载源代码。

测试应用

1)使用用户"lokesh"登录

具有保护切入点的 Spring 方法安全性 - 图1

2)将员工添加到列表中

具有保护切入点的 Spring 方法安全性 - 图2

3)用户添加成功

具有保护切入点的 Spring 方法安全性 - 图3

4)尝试删除员工。 访问被拒绝。

具有保护切入点的 Spring 方法安全性 - 图4

5)用管理员用户登录

具有保护切入点的 Spring 方法安全性 - 图5

6)将员工添加到列表中

具有保护切入点的 Spring 方法安全性 - 图6

7)用户添加成功

具有保护切入点的 Spring 方法安全性 - 图7

8)尝试删除员工。 员工已删除。

具有保护切入点的 Spring 方法安全性 - 图8

9)尝试删除其他员工。 员工已删除。

具有保护切入点的 Spring 方法安全性 - 图9

源代码下载

下载源码

学习愉快!