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

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

总览

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

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

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

<user-service>
	<user name="lokesh" password="password" authorities="ROLE_USER" />
	<user name="admin"  password="password" authorities="ROLE_USER,ROLE_ADMIN" />
</user-service>

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

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

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

完整的XML配置如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
	xmlns:beans="http://www.springframework.org/schema/beans" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
	http://www.springframework.org/schema/security
	http://www.springframework.org/schema/security/spring-security-3.0.3.xsd">
	
	<global-method-security>
		<protect-pointcut expression="execution(* com.how2codex.service.*Impl.add*(..))" access="ROLE_USER"/>
		<protect-pointcut expression="execution(* com.how2codex.service.*Impl.delete*(..))" access="ROLE_ADMIN"/>
	</global-method-security>
	
	<http auto-config="false"  use-expressions="true">
		<intercept-url pattern="/login" access="permitAll" />
		<intercept-url pattern="/logout" access="permitAll" />
		<intercept-url pattern="/accessdenied" access="permitAll" />
		<intercept-url pattern="/**" access="hasRole('ROLE_USER')" />
		<form-login login-page="/login" default-target-url="/list" authentication-failure-url="/accessdenied" />
		<logout logout-success-url="/logout" />
	</http>

	<authentication-manager alias="authenticationManager">
        <authentication-provider>
            <user-service>
                <user name="lokesh" password="password" authorities="ROLE_USER" />
                <user name="admin" password="password" authorities="ROLE_USER,ROLE_ADMIN" />
            </user-service>
        </authentication-provider>
    </authentication-manager>
    
    <beans:bean id="employeeDAO" class="com.how2codex.dao.EmployeeDaoImpl" />
    <beans:bean id="employeeManager" class="com.how2codex.service.EmployeeManagerImpl" />
    
</beans:beans>

应用安全性的管理器类

package com.how2codex.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.how2codex.dao.EmployeeDAO;
import com.how2codex.entity.EmployeeEntity;

@Service
public class EmployeeManagerImpl implements EmployeeManager {
	
	@Autowired
    private EmployeeDAO employeeDAO;

	@Override
	@Transactional
	public void addEmployee(EmployeeEntity employee) {
		employeeDAO.addEmployee(employee);
	}

	@Override
	@Transactional
	public List<EmployeeEntity> getAllEmployees() {
		return employeeDAO.getAllEmployees();
	}

	@Override
	@Transactional
	public void deleteEmployee(Integer employeeId) {
		employeeDAO.deleteEmployee(employeeId);
	}

	public void setEmployeeDAO(EmployeeDAO employeeDAO) {
		this.employeeDAO = employeeDAO;
	}
}

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

测试应用

1)使用用户“ lokesh”登录

与用户登录

2)将员工添加到列表中

lokesh添加用户成功1

3)用户添加成功

lokesh添加用户成功2

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

lokesh删除用户失败

5)用管理员用户登录

使用用户管理员登录

6)将员工添加到列表中

管理员添加用户成功1

7)用户添加成功

管理员添加用户成功2

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

管理员删除用户成功1

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

管理员删除用户成功2

源代码下载

学习愉快!

saigon has written 1440 articles

2 thoughts on “具有保护切入点的Spring方法安全性

Leave a Reply