SpringBoot可用的无数据库后台授权解决方案

7 篇文章 0 订阅
5 篇文章 0 订阅
该方案提出了一种在无数据库环境下,通过ini文件配置后台管理程序的访问授权规则。配置包括URL、页面元素的授权,涉及用户、角色、IP黑名单等。主要类如VerifyService.java用于验证访问权限,SecurityService.java集成到SpringSecurity中。项目源码可在GitHub和Gitee找到,但警告此方法安全性未经严格验证,仅适用于学习交流。
摘要由CSDN通过智能技术生成

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项目,自行发布版本到本地仓库。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值