今天继续教育办公系统的旅程,今天主要讲的是权限模块:
1. 集成 spring-security 框架
1). 加入 spring-security 的两个 jar 包
2). 在 web.xml 文件中加入加入 spring-security 框架的过滤器
3). 新建 applicationContext-security.xml 配置文件,并且把 security 作为默认的命名空间, 并将其导入到 applicationContext.xml 中
4). 设计领域模型:
Authority -- 权限
Resource -- 资源
Role -- 角色
Employee -- 添加 Set<Role> roleSet 属性
Resource 和 Authority 为多对多的对应关系
Authority 和 Role 为多对多的对应关系
Role 和 Employee 为多对多的对应关系
所以还需要 3 个额外的关联表
** 数据表设计参见 spring-security-2
5).
①. 修改当前系统的 login.jsp 页面, 改为 spring-security 的登录页面, 并且在 <http> 节点中进行配置.
** 注意: spring-security 在登录成功后, 利用 "重定向" 转到 form-login 节点对应的 default-target-url 属性对应的页面. 所以不能直接将其配置为
/WEB-INF 目录下的任何页面
②. 新建 UserDetailsService 接口的实现类, 以实现从数据库中获取用户信息(需要查询 Employee, Role, Authority, 参见 spring-security-2 的
UserDetailsServiceImpl, 但基于 Hibernate 实现),
并把该类的 Bean 引用装配给 <authentication-provider> 节点的 user-service-ref 属性
6). 新建 ResourceDetailsService 接口的实现类, 实现从数据库中读取需要被保护的资源信息及其可以访问这些资源的权限信息
7). 利用 FactoryBean 新建 DefaultFilterInvocationDefinitionSource 接口的 Bean, 并把 ResourceDetailsService 的 Bean 注入进来,
再把该 Bean 配置为 filterSecurityInterceptor 过滤器的 objectDefinitionSource 属性
2. 实现权限模块:
1). 实现 Role 的增, 删, 改, 查
①. 角色的添加:
-->. 页面 UI:
a. 对字段的 jQuery validation 验证
b. struts validator 验证 **
c. Action的复杂验证: 角色名不能重复 **.
d. 角色名的 ajax 验证, 角色名不能重复 **.
e. 勾选权限时的级联选择. 例如: 勾选 "员工删除" 的同时必须勾选 "员工查询", 即不能让用户只有 "员工删除" 权限, 而没有 "员工查询" 权限.
f. 使用到 Authority 的如下两个字段: relatedAuthorites(与当前权限关联的权限信息, 多个权限使用 "," 分隔),
parentAuthority(当前权限的父权限)
subAuthorities(当前权限的子权限)
-->. 若验证都通过, 在 Action 中受理请求, 录入角色
②. 注意:
--> 不能通过以下代码获取 parentAuthority 为 null 的 Authority 集合
List list = authorityDao.findBy("parentAuthority", null);
System.out.println(list.size());
而应该使用:
List list = authorityDao.find("FROM Authority auth WHERE auth.parentAuthority IS null");
System.out.println(list.size());
③. -->为 #select 添加 change 相应事件, 当选取某个父权限时, 子权限显示
-->实现权限的级联选择: 使用 Authority 的 relatedAuthorites
2). 实现可以对 Employee 的 Role 的赋予和修改
2). 实现导航的页面的权限化, 根据当前登录员工的权限定制 struts-menu, 并添加登出功能.
①. 参考 struts-menu 例程中的 Dynamic, Databased-driven Menu 链接中的代码, 提供模拟实现
-员工管理
-员工添加
-员工查询
②. 修改 Authority 领域模型使其适应 struts-menu 实现:
private Authority parentAuthority;
private Set<Authority> subAuthorities;
private Resource mainResource;
private int isNavigate;
③. 新建 MenuAction, 用于显示当前登录用户的导航按钮树.
a. 获取当前用户的登录名
b. 利用登录名获取当前用户的所具有的一切权限信息, 利用这些权限构建导航按钮树.