ejabberd从14.07开始使用新的yaml格式的配置文件。在ejabberd中,与权限相关的配置基本上都由访问控制列表(ACL)和访问权限(Access Rights)来协同确定。ejabberd的配置文件中有两个选项acl和access分别代表acl的定义和access的定义。
acl说白了就是一个过滤表达式,所有的JID经过ACL的过滤之后才会传递给Access。access选项相当于一个布尔表达式,不过它只会返回allow与deny。allow代表可以符合ACL定义的那些JID可以访问某服务,deny代表符合ACL定义的那些JID不可以访问某服务。
配置文件中acl的声明语法如下:
acl: {ACLName: {ACLType: ACLValue }}
ACLType: ACLValue 可以是以下之一:
all 匹配所有的JID
user: Username 匹配第一个虚拟主机上用户名为Username的用户
user: {Username: Server} 匹配JID是Username@Server的用户,不管资源是什么
server: Server 匹配服务器上Server上的任何用户
resource: Resource 匹配资源是Resource的任何JID
shared_group: Groupname 匹配虚拟主机上共享组名为Groupname的任何组成员
shared_group: {Groupname: Server} 匹配虚拟主机Server上共享组名为Groupname的组的任何组成员
ip: Network 匹配网络Network中的任何ip地址
user_regexp: Regexp 匹配本地虚拟主机上用户名符合正则表达式Regexp的任何用户
user_regexp: {Regexp: Server}
server_regexp: Regexp
resource_regexp: Regexp
node_regexp: {UserRegexp: ServerRegexp}
user_glob: Glob
user_glob: {Glob: Server}
server_glob: Glob
resource_glob: Glob
node_glob: {UserGlob: ServerGlob}
all
none
访问权限的语法是:
access: {AccessName: {ACLName:allow|deny }}
有两个预定义的AccessName:
all 返回allow
none 返回deny
当JID用户要访问某服务的时候,如果该服务定义了access选项,则会检查相应的Accessname来决定该用户是否具有访问权限。
举个ejabberd-14.07中的例子:ejabberd-14.07编译安装完成之后是不支持带内注册(也就是通过客户端注册)的然而官方的文档却说默认支持带内注册,这是错误的。默认的与带内注册权限相关的配置信息是这样的:
acl:
loopback:
ip:
- "127.0.0.0/8"
access:
trusted_network:
loopback: allow
mod_register:
ip_access: trusted_network
ip_access选项中的Accessname是trusted_network。然后可以得出该AccessName对应的ACLName是loopback。也就是说符合loopback这个过滤表达式的JID都可以进行带内注册。再往上看得到只有位于子网127.0.0.0/8内的客户端才符合这个过滤表达式。因此如果你的客户端不在该子网内是不允许进行带内注册的。可以直接将ip_access对应的AccessN改为all即可。
acl说白了就是一个过滤表达式,所有的JID经过ACL的过滤之后才会传递给Access。access选项相当于一个布尔表达式,不过它只会返回allow与deny。allow代表可以符合ACL定义的那些JID可以访问某服务,deny代表符合ACL定义的那些JID不可以访问某服务。
配置文件中acl的声明语法如下:
acl: {ACLName: {ACLType: ACLValue }}
ACLType: ACLValue 可以是以下之一:
all 匹配所有的JID
user: Username 匹配第一个虚拟主机上用户名为Username的用户
user: {Username: Server} 匹配JID是Username@Server的用户,不管资源是什么
server: Server 匹配服务器上Server上的任何用户
resource: Resource 匹配资源是Resource的任何JID
shared_group: Groupname 匹配虚拟主机上共享组名为Groupname的任何组成员
shared_group: {Groupname: Server} 匹配虚拟主机Server上共享组名为Groupname的组的任何组成员
ip: Network 匹配网络Network中的任何ip地址
user_regexp: Regexp 匹配本地虚拟主机上用户名符合正则表达式Regexp的任何用户
user_regexp: {Regexp: Server}
server_regexp: Regexp
resource_regexp: Regexp
node_regexp: {UserRegexp: ServerRegexp}
user_glob: Glob
user_glob: {Glob: Server}
server_glob: Glob
resource_glob: Glob
node_glob: {UserGlob: ServerGlob}
all
none
访问权限的语法是:
access: {AccessName: {ACLName:allow|deny }}
有两个预定义的AccessName:
all 返回allow
none 返回deny
当JID用户要访问某服务的时候,如果该服务定义了access选项,则会检查相应的Accessname来决定该用户是否具有访问权限。
举个ejabberd-14.07中的例子:ejabberd-14.07编译安装完成之后是不支持带内注册(也就是通过客户端注册)的然而官方的文档却说默认支持带内注册,这是错误的。默认的与带内注册权限相关的配置信息是这样的:
acl:
loopback:
ip:
- "127.0.0.0/8"
access:
trusted_network:
loopback: allow
mod_register:
ip_access: trusted_network
ip_access选项中的Accessname是trusted_network。然后可以得出该AccessName对应的ACLName是loopback。也就是说符合loopback这个过滤表达式的JID都可以进行带内注册。再往上看得到只有位于子网127.0.0.0/8内的客户端才符合这个过滤表达式。因此如果你的客户端不在该子网内是不允许进行带内注册的。可以直接将ip_access对应的AccessN改为all即可。