前两天我们已经学习过 spring-security 框架了.经过一天的复习,已经初步的掌握了.今天我们就要把spring-security 框架运用到我们的教育办公系统中了.由spring-security 框架来负责我们系统的权限功能的实现.在这个项目功能的实现过程中,更近一步的体会spring-security 框架的优缺点.
1. 集成 spring-security 框架
1). 加入 spring-security 的两个个jar 包
2). 在 web.xml 文件中加入加入 spring-security 框架的过滤器
3). 新建 applicationContext-security.xml 配置文件,并且把 security 作为默认的命名空间, 并将其导入到 applicationContext.xml 中
2. 设计领域模型:
Authority -- 权限
Resource -- 资源
Role -- 角色
Employee -- 添加 Set<Role> roleSet 属性
3.分析项目中对象的关系
Resource 和 Authority 为多对多的对应关系
Authority 和 Role 为多对多的对应关系
Role 和 Employee 为多对多的对应关系
所以还需要 3 个额外的关联表
4.页面的处理
1)修改当前系统的 login.jsp 页面, 改为 spring-security 的登录页面, 并且在 <http> 节点中进行配置.
2) 新建 UserDetailsService 接口的实现类, 以实现从数据库中获取用户信息, 并把该类的 Bean 引用装配给 <authentication-provider> 节点的 user-service-ref 属性
5.实现步骤
1)向 ems_resource_table, ems_authority_table, ems_resource_authority_table 数据表中添加数据
2)新建 ResourceDetailsService 接口的实现类, 实现从数据库中读取需要被保护的资源信息及其可以访问这些资源的权限信息
3)利用 FactoryBean 新建 DefaultFilterInvocationDefinitionSource 接口的 Bean, 并把 ResourceDetailsService 的 Bean 注入进来, 再把该 Bean 配置为 filterSecurityInterceptor 过滤器的 objectDefinitionSource 属性
6. 实现权限模块:
1). 实现导航的页面的权限化, 根据当前登录员工的权限定制 struts-menu, 并添加登出功能.
①. 参考 struts-menu 例程中的 Dynamic, Databased-driven Menu 链接中的代码, 提供模拟实现
-员工管理
-员工添加
-员工查询
②. 修改 Authority 领域模型使其适应 struts-menu 实现:
/**
* 当前权限的父权限
*/
private Authority parentAuthority;
/**
* 当前权限的子权限
*/
private Set<Authority> subAuthorities;
/**
* 进入当前权限的 Resource 引用
*/
private Resource mainResource;
/**
* 是否是导航菜单. 1 -- 是, 0 -- 不是
*/
private int isNavigate;
③. 新建 MenuAction, 用于显示当前登录用户的导航按钮树.
a. 获取当前用户的登录名
b. 利用登录名获取当前用户的所具有的一切权限信息, 利用这些权限构建导航按钮树.
2). 实现 Role 的增, 删, 改, 查
3). 实现可以对 Employee 的 Role 的赋予和修改