Apache Shiro和Spring Security不同,它没有自带的登录页面和基于内存的权限验证。所以我们将使用jsp去编写简单的登录页面,使用Mybatis连接MySQL数据库进行用户及其权限和角色信息的存取。
项目创建完成后,补充相应的依赖,pom.xml 文件中配置的完整依赖项如下:
以上也提到了我们需要在数据库中进行用户及其权限和角色信息的存取,并且我们将按照 RBAC 模型完成文中 Case 的开发,所以首先需要创建数据库表格及向表格插入一些数据。具体的 sql 语句如下:
创建与表格所对应的 pojo 类。如下:
然后创建 dao 层的 mapper 接口:
以及编写与之对应的 xml 文件:
接着是 service 层接口:
public interface UserService {
/**
* 根据用户名查找用户
*
* @param username 用户名
* @return user
*/
User findByUserName(String username);
}
编写实现类来实现 UserService 接口:
到此为止,我们就完成了项目基本结构的搭建,接下来我们就可以开始 Case 的开发了。
自定义权限管理
我们来基于 Apache Shiro 实现一个自定义的认证、授权及密码匹配规则。首先是创建我们自定义的 Realm,在 Realm 实现授权及认证登录,代码如下:
因为登录时用户输入的密码需要与数据库里的密码进行对比,所以我们还可以自定义一个密码校验规则。代码如下:
最后是新建一个配置类来注入 shiro 相关的配置,代码如下:
相关接口及登录页面的开发
新建一个 DemoController,用于提供外部访问的接口。代码如下:
在配置文件中,配置 jsp 文件所在的路径:
由于需要跳转 jsp,所以还需配置项目的 web resource 路径:
配置好后会生成一个 webapp 目录,在该目录下创建 pages 目录,并新建 jsp 文件。其中 login.jsp 文件内容如下:
index.jsp 文件内容如下:
unauthorize.jsp 文件内容如下:
启动项目,在没有登录的情况下访问 index 接口,会跳转到登录页面上
如果我们要实现某个接口需要某个权限才能访问的话,可以在 ShiroConfiguration 类的 shiroFilter 方法中,关于定义请求拦截规则那一块去配置。例如我希望 edit 只能由拥有 edit 权限的用户才能访问,则添加如下代码即可:
如果需要开启权限缓存的话,可以在配置 AuthRealm 的时候进行定义。例如我这里使用 Shiro 自带的权限缓存,如下:
总结
优点:
- 提供了一套框架,而且这个框架可用,且易于使用
- 灵活,应对需求能力强,Web 能力强
- 可以与很多框架和应用进行集成
缺点:
- 学习资料比较少
- 除了需要自己实现 RBAC 外,操作的界面也需要自己实现