修改SimpleSAMLphp,针对特定用户组进行操作

今天要讲的是一个想了我两三天的破事:

如何直接禁止一整个用户组登录NextCloud?

其实我仔细看了看这套代码,发现这个问题可以等价换算成:

如何禁止一整个用户组登录某个服务?

或者:

如何禁止Lv1等级以下的用户登录某个服务?

那我们第一时间想到的肯定是在服务的那边配置。但问题就来了:

在NextCloud做手脚?不太好办,我说详细点,NextCloud是没有针对整个用户组进行封禁的功能,而且Discourse的用户分组很坑,比如Lv2,是同时在Lv2,Lv1,Lv0三个用户组里的。。。对的。。。它高等级的用户居然不会自动退出低等级的用户组。。。

这就导致了就算你有办法在NextCloud封禁整个用户组,也可能会出现各种莫名其妙的bug —— 毕竟你把所有的用户都封了。。。(对,discourse管理员都是在Lv0用户组里的。。。)

那我们可以试图在SimpleSAMLphp做改动,在返回给NextCloud的SAML数据中做点有意思的手脚。

好,我们开始吧,希望你看完能给我点个赞,可怜我死了两三天的脑细胞。

我们需要准备的是,在服务那边,创建一个叫做suspend的用户,然后禁用它。保证你每次用suspend来登录,它都是无法登录的。准备工作做完了,我们就可以开始了。

打开saml20-sp-remote.php,开始编辑你的SP metadata。

首先,将你要用到的SAML数据标准化为单独数据。

    50 => array(
        'class' => 'core:AttributeCopy',
        'discourse.username' => 'username',
    ),
    51 => array(
        'class' => 'core:AttributeCopy',
        'discourse.email' => 'email',
    ),
    52 => array(
        'class' => 'core:AttributeCopy',
        'discourse.groups' => 'groups',
    ),

然后我们需要添加一个变量,这个变量决定了我们是否要封禁用户。该变量allowance默认为suspend(封禁)。

    53 => array(
        'class' => 'core:AttributeAdd',
        'allowance' => "suspend",
    ),

判断用户是否在Lv1用户组(或以上),如果是的话,将变量allowance改为allow(允许)。

    54 => array(
        'class' => 'core:AttributeValueMap',
        'sourceattribute' => 'discourse.groups',
        'targetattribute' => 'allowance',
        '%replace',
        'values' => array(
            'allow' => array(
                    'trust_level_1',
            ),
        ),
    ),

这时候,我们需要判断allowance是否为suspend,如果是的话,将用户数据全部重写为suspend用户。

     55 => array(
        'class' => 'core:AttributeAlter',
        'subject' => 'allowance',
        'pattern' => '/suspend/',
        'target' => 'username',
        '%replace',
     ),
     56 => array(
        'class' => 'core:AttributeAlter',
        'subject' => 'allowance',
        'pattern' => '/suspend/',
        'target' => 'email',
        '%replace',
     ),
     57 => [
        'class' => 'core:AttributeAlter',
        'subject' => 'email',
        'pattern' => '/suspend/',
        'replacement' => 'suspend@你的域名',
        '%replace',
     ],
     58 => array(
        'class' => 'core:AttributeAlter',
        'subject' => 'allowance',
        'pattern' => '/suspend/',
        'target' => 'groups',
        '%replace',
     ),

至此,普通用户的登录数据不受变动,而Lv1以下的用户若尝试登录的话,SimpleSAMLphp会将其用户数据重写为suspend这个封禁帐户。

呜呜呜再次求点赞求求了qwq

(番外:你们知道allowance有津贴 /补助金的意思吗(((就是说那个什么能不能如果有可能的话给我打赏一下捏(超级小声)打赏方式在 docs.rail.moe 啦但其实不打也没什么关系……)

1 个赞