1、概述
此方案适用于无数据库环境的后台管理程序配置访问授权规则。
通过纯文件的配置方式,可以对请求的url以及页面中的元素配置独立授权。
2、配置方式
配置方案基于ini文件格式,除了url、元素授权部分是动态增加,其他配置项是固定结构的,注意不要遗漏,配置参考如下:
# 基于ini文件格式的配置方案
# 列表类型数据,均用,号分割
# 账号配置
[users]
# 用户名 = md5(密码)
admin = 456b7016a916a4b178dd72b947c152b7
# 角色配置
[roles]
# admin组为默认管理员组
admin = admin,other
# 黑名单配置
[black]
# 账号规则
user = 账号1,账号2
# 角色规则
role = 角色1,角色2
# ip规则
ip = 1.1.1.1,1.1.1.*,1.1.*,1.*
# 访问路径规则
# 全据授权 *为全允许,空白为全拒绝
[*]
user = *
# 根路径,需要登录才可以访问
[/]
user = *
[/access1]
# admin/角色manager可以访问
role = manager
[/access/access2]
# admin/lina/marry/john可以访问
role = manager
user = john
[/access3]
# 除了john,其他都可以访问
user = *
deny = john
[/anonymous]
# 无需登录,任何人都可以访问
anonymous = true
[/anonymous/*]
# 含下级路径,无需登录,任何人都可以访问
anonymous = true
# 页面元素访问规则,要配合thymeleaf标签属性使用
# <div class="CSS_BLOCK_ID" th:verify>
# <button id="BTN_CANCEL"/>
# <button id="BTN_SUBMIT" th:verify/>
# </div>
[/access/access2:.CSS_BLOCK_ID]
# div元素 admin/john/marry可以访问,lina不可以访问
role = manager
user = john
deny = lina
[/access/access2:#BTN_SUBMIT]
# button元素 admin/lina/marry可以访问,john不可以访问
deny = john
3、主要类和方法
VerifyService.java
// 在访问的url前,执行验证规则,true表示可以访问,false表示拒绝访问
// 页面元素th:verify不可访问时,直接不生成该元素
public boolean validate(HttpServletRequest request, Authentication authentication){
String uri = request.getRequestURI();
Object principal = authentication.getPrincipal();
log.debug( "验证用户访问权限,访问地址=" + uri + ", 用户=" + principal );
boolean result = false;
// 1. 先验证页面是否允许访问: 匿名页面、错误页面、登录、注册、登出不验证是否登录
boolean is_anonymous = this.validateAnonymous(uri);
if( is_anonymous ){
result = this.validateBlack(request, authentication);
if( result ){
return false;
}
return true;
}
int error_code = this.validateErrorPage(request,uri);
if( error_code >= ICodeDefine.ErrorCode ){
return true;
}
// 2. 验证页面是否需要登录访问
if( principal instanceof SuperUser ){
ServerMessage msg = new ServerMessage();
// 3. 验证页面是否配置了访问权限
result = this.validateBlack(request, authentication);
if (result) {
msg.setCode(ICodeDefine.User_IsBlack);
} else {
// 4. 验证用户是否有页面访问权限
int code = this.velidateRequest(request, authentication);
msg.setCode(code);
result = code == ICodeDefine.SuccessCode;
}
log.debug( "验证结果:" + msg );
request.getSession().setAttribute( ISupportEL.Message_EL, msg );
}else{
// 没有登录
}
if( !result ){
result = this.validateAdministrator(authentication);
}
return result;
}
SecurityService.java
// 配置Spring Security时,增加验证规则
_hs.authorizeRequests()
.and().authorizeRequests().anyRequest().access( "@verifyService.validate( request, authentication )" );
4、注意事项
上述功能仅适用于本地无数据的应用程序,授权功能未做严谨的验证,因此无法判断此方法是否安全,所以此方法仅供学习交流使用,使用时请自行判断使用场景是否合适。
5、项目参考地址
https://gitee.com/aiyoyoyo/jeesupport/tree/master/jees-webs
gitee的同步可能会晚于github,最新代码见:https://github.com/aiyoyoyo/jeesupport
另外,由于近期开发主体不在java这边,基于在线maven仓库的版本,最新版将不定时发布,无法正确引入版本的话,可以下载jeesupport项目,自行发布版本到本地仓库。