今天要讲的是一个想了我两三天的破事:
如何直接禁止一整个用户组登录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 啦但其实不打也没什么关系……)