## 权限插件
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';
}
~~~
- 前言
- 捐赠ESD项目
- 使用篇-通用
- 环境
- 安装
- 规范
- 压力测试
- 配置
- 如何设置YML配置
- server配置
- 端口配置
- 项目结构
- 事件派发
- 日志
- 注解
- DI容器
- 自定义进程
- 并发及协程池
- Console插件
- Scheduled插件
- Redis插件
- AOP插件
- Saber插件
- Mysql插件
- mysql事务
- Actuator插件
- Whoops插件
- Cache插件
- PHPUnit插件
- Security插件
- Session插件
- EasyRoute插件
- http路由
- ProcessRpc插件
- AutoReload插件
- AnnotationsScan插件
- Tracing-plugin插件
- MQTT插件
- Pack插件
- AMQP插件
- Validate插件
- Uid插件
- Topic插件
- Blade插件
- CsvReader插件
- hashed-wheel-timer-plugin插件
- 使用篇-HTTP
- 路由
- 静态文件
- 路由定义
- 修饰方法
- 路由分组
- 资源路由
- 端口作用域
- 异常处理
- 跨域请求
- 路由缓存
- 控制器
- 控制器初始化
- 前置操作
- 跳转和重定向
- 异常处理
- 请求
- 请求对象
- 请求信息
- request消息
- response消息
- stream消息
- url接口
- 验证器
- 内置验证器
- 内置过滤器
- 使用篇-WS
- 如何使用
- 路由
- 使用篇-TCP
- 插件篇-PluginSystem
- 微服务篇-ESDCloud
- CircuitBreaker插件
- SaberCloud插件
- 分布式链路追踪系统
- Consul插件