以前用spring security 做过url级别的权限控制,但一些简单的应用应该可以满足了,一些复杂的应用,权限是到方法级别的。花了一点时间看了一下,要做到method级别的控制通过简单的配置也可以做到.
1. 首先得修改 配置文件, 比如spring-security.xml。允许 @PreAuthorize和@PostAuthorize注解.
程序代码
<global-method-security pre-post-annotations="enabled" />
这些注解接受一个参数,要么是角色名称,要么是表达式. 如果你设置的是 use-expression 为 true , 将会采用表达式. 否则将会直接用 角色名称.
2. 在要保护的方法上加上注解
程序代码
...
@Repository
public class EmployeeDaoImpl implements EmployeeDAO {
@Autowired
private SessionFactory sessionFactory;
// 注意这里方法保护,按角色.
@PreAuthorize("hasRole('ROLE_ADMIN')")
@Override
public void addEmployee(EmployeeEntity employee) {
//System.out.println(((User)SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getAuthorities());
this.sessionFactory.getCurrentSession().save(employee);
}
@SuppressWarnings("unchecked")
@Override
public List<EmployeeEntity> getAllEmployees() {
return this.sessionFactory.getCurrentSession().createQuery("from Employee").list();
}
...
3. 运行程序,登陆测试。
如果是普通用户登陆,添加用户,报错 403 没有权限
如果是管理员登陆之后,就可以正常添加用户.
例子用到的数据脚本如下:
程序代码
Create TABLE `employee` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`FIRSTNAME` varchar(30) DEFAULT NULL,
`LASTNAME` varchar(30) DEFAULT NULL,
`TELEPHONE` varchar(15) DEFAULT NULL,
`EMAIL` varchar(30) DEFAULT NULL,
`CreateD` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
程序代码demo 下载:
spring security method demo download