🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 权限插件 ESD 默认已经安装,无需手动安装,该插件需要依赖redis,使用前请先配置redis连接。 ## 插件配置 该插件无需配置 ## Security 初始化 权限插件提供了,基于角色和权限的鉴权方式。 ~~~ use ESD\Plugins\Security\Beans\Principal; ~~~ 以下代码创建了一个角色为`guest`,权限 `read` 的配置。最后调用 `setPrincipal` 保存配置对象。如果使用权限的类没有继承 `GoController`,需要`use trait GetSecurity`,来加入 `getPrincipal,setPrincipal` 方法。您也可可以根据项目选择仅用`Role`,或仅用`Permissions`。 ~~~ $principal = new Principal(); $principal->addRole("guest"); $principal->addPermissions('read'); $principal->setUsername("guest"); $this->setPrincipal($principal); ~~~ 一般情况下,我们应该在用户登录设置完 uid 后再执行如下代码,如。 ~~~ if($this->session->isAvailable()){ return $this->session->getId(); }else{ $this->session->create(); $this->session->setAttribute('uid',1); $principal = new Principal(); $principal->addRole("guest"); $principal->addPermissions('read'); $principal->setUsername("guest"); $this->setPrincipal($principal); return 'set guest'; } ~~~ ## 鉴权 鉴权部分可以使用注解的形式对需要鉴权的方法进行声明,同样的您也可以直接在需要鉴权的位置直接调用鉴权函数,下面具体说明。 ## @PreAuthorize 该注解将会先进行鉴权,如果鉴权返回 true,才会执行该方法。 PreAuthorize 输入的是一个表达式如果最终返回 true,就会执行该方法,默认提供了几种。 通过 $p可以获取到入参数组 ### hasRole >[info]是否拥有某个角色 ~~~ /** * @PreAuthorize("hasRole('guest')") */ public function http_has_guest(){ return 'has role guest'; } ~~~ ### hasAnyRole >[info]是否拥有其中一个角色 ~~~ /** * @PreAuthorize("hasAnyRole(['guest','member'])") */ public function http_has_any(){ return 'has guest member'; } ~~~ ### hasPermission >[info]是否拥有某个权限 ~~~ /** * @PreAuthorize("hasPermission('read')") * @return string */ public function http_has_read(){ $auth = $this->getPrincipal(); $username = $auth->getPermissions(); return $username; } ~~~ ### isAuthenticated >[danger]是否已经登录(注意是设置过 Principal,如需使用该方法,请自行保证登录后再设置角色。未登录就设置 Role 同样会认为已授权) ~~~ /** * @PreAuthorize("isAuthenticated()") */ public function http_hello(){ $role = $this->getPrincipal(); return 'hello :'.$role->getUsername(); } ~~~ ### hasIpAddress >[info]是否符合某个IP地址规则 ~~~ /** * @PreAuthorize("hasIpAddress('10.0.0.0/16')") */ public function http_access(){ $ip = $this->request->getServer(Request::SERVER_REMOTE_ADDR); return 'hello ' . $ip; } ~~~ ## @PostAuthorize >[info]后置鉴权,通过返回值判断是否应该含有权限,通过$p获取入参,通过$returnObject获取返回值 ~~~ /** * @PostAuthorize("$returnObject->group == 1") */ ~~~ ## 给整个控制器增加授权 >[info]需要在类的 initialization 方法上加入注解。 ~~~ /** * @PreAuthorize("hasRole('guest')") * @param string|null $controllerName * @param string|null $methodName * @return mixed|void * @throws AccessDeniedException */ public function initialization(?string $controllerName, ?string $methodName) { parent::initialization($controllerName, $methodName); $this->response->addHeader("Content-type", "text/html;charset=UTF-8"); } ~~~ ## 非注解使用 >[info]以上方法也可直接使用。如 ~~~ public function http_role(){ if(!hasRole('guest')){ return 'err'; } return 'succ'; } ~~~