请大神指导一下 yii2 的yii2 oauth2 微信什么玩

拒绝访问 |
| 百度云加速
请打开cookies.
此网站 () 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(6628-ua98).
重新安装浏览器,或使用别的浏览器博客访问: 379865
博文数量: 32
博客积分: 1785
博客等级: 上尉
技术积分: 821
注册时间:
我,计算机应用技术嵌入式方向出身,从事软件工程师工作,主要负责linux服务器维护,asterisk呼叫中心服务器维护,ERP和CRM系统开发,pbx系统开发,以及网站建设。
希望能交更多的朋友。
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: PHP
授权是验证用户是否有足够的权限做一些事情的过程。 Yii提供控制它的几种方法。
访问控制基础(Access control basics)
Access control basics很简单实现使用[[yii\web\AccessControl]]:
class SiteController extends Controller
&& &public function behaviors()
&&&&&& &return [
&&&&&&&&&& &'access' =& [
&&&&&&&&&&&&&& &'class' =& \yii\web\AccessControl::className(),
&&&&&&&&&&&&&& &'only' =& ['login', 'logout', 'signup'],
&&&&&&&&&&&&&& &'rules' =& [
&&&&&&&&&&&&&&&&&& &[
&&&&&&&&&&&&&&&&&&&&&& &'actions' =& ['login', 'signup'],
&&&&&&&&&&&&&&&&&&&&&& &'allow' =& true,
&&&&&&&&&&& &&&&&&&&&&&&'roles' =& ['?'],
&&&&&&&&&&&&&&&&&& &],
&&&&&&&&&&&&&&&&&& &[
&&&&&&&&&&&&&&&&&&&&&& &'actions' =& ['logout'],
&&&&&&&&&&&&&&&&&&&&&& &'allow' =& true,
&&&&&&&&&&&&&&&&&&&&&& &'roles' =& ['@'],
&&&&&&&&&&&&&&&&&& &],
&&&&&&&&&&&&&& &],
&&&&&& &&&&&],
&&&&&& &];
&& &// ...
在上面的代码中,我们要附加的访问控制行为给控制器。因为只有指定的选项,它会被应用到'登录','退出',只有'注册'的行动。一组基本的选择规则[[yii\web\AccessRule]]内容如下:
让所有来宾(尚未验证)的用户访问“登录”和“注册”的行动。
允许通过验证的用户才能访问'注销'的行动。
规则检查一个接一个从顶部到底部。如果规则匹配,动作立即发生。如果没有,下一个规则进行检查。如果没有规则匹配的访问被拒绝。
[[yii\web\AccessRule]]&是相当灵活的,允许另外什么被证明检查IP地址和请求方法(即POST,GET)。如果不是的话,你可以通过匿名函数指定自己的检查:
class SiteController extends Controller
&& &public function behaviors()
&&&&&& &return [
&&& &&&&&&&&'access' =& [
&&&&&&&&&&&&&& &'class' =& \yii\web\AccessControl::className(),
&&&&&&&&&&&&&& &'only' =& ['special-callback'],
&&&&&&&&&&&&&& &'rules' =& [
&&&&&&&&&&&&&&&&&& &[
&&&&&&&&&&&&&&&&&&&&&& &'actions' =& ['special-callback'],
&&&&&&&&&&& &&&&&&&&&&&&'allow' =& true,
&&&&&&&&&&&&&&&&&&&&&& &'matchCallback' =& function ($rule, $action) {
&&&&&&&&&&&&&&&&&&&&&&&&&& &return date('d-m') === '31-10';
&&&&&&&&&&&&&&&&&&&&&& &}
&&&&&&&&&&&&&&&&&& &],
&& &// ...
&& &// Match callback called! 此页面可以访问只有每个10月31日
&& &public function actionSpecialCallback()
&&&&&& &return $this-&render('happy-halloween');
有时你想,当访问被拒绝采取自定义操作。在这种情况下,你可以指定denyCallback
基于角色的访问控制(RBAC)
基于角色的访问控制是非常灵活的方式来控制访问是一个完美的匹配的复杂系统中的权限是可以定制的。
使用基于文件的配置的RBAC
为了开始使用它,需要一些额外的步骤。首先,我们需要配置authManager应用程序组件在应用程序配置文件(web.php或main.php取决于你使用的模板):
'authManager' =& [
&& &'class' =& 'app\components\PhpManager',
&& &'defaultRoles' =& ['guest'],
经常使用角色存储在同一个数据库表的其它用户数据。在这种情况下,我们可以将它定义通过创建自己的组件app/components/PhpManager.php
namespace app\components;
class PhpManager extends \yii\rbac\PhpManager
&& &public function init()
&&&&&& &parent::init();
&&&&&& &if (!Yii::$app-&user-&isGuest) {
&&&&&&&&&& &//我们假设用户的角色是存储在身份
&&&&&&&&&& &$this-&assign(Yii::$app-&user-&identity-&id, Yii::$app-&user-&identity-&role);
use yii\rbac\Item;
&& &//这是你们的管理任务
&& &'manageThing0' =& ['type' =& Item::TYPE_OPERATION, 'description' =& '...', 'bizRule' =& NULL, 'data' =& NULL],
&& &'manageThing1' =& ['type' =& Item::TYPE_OPERATION, 'description' =& '...', 'bizRule' =& NULL, 'data' =& NULL],
&& &'manageThing2' =& ['type' =& Item::TYPE_OPERATION, 'description' =& '...', 'bizRule' =& NULL, 'data' =& NULL],
&& &'manageThing3' =& ['type' =& Item::TYPE_OPERATION, 'description' =& '...', 'bizRule' =& NULL, 'data' =& NULL],
&& &//过程中的作用
&& &'guest' =& [
&&&&&& &'type' =& Item::TYPE_ROLE,
&&&&&& &'description' =& 'Guest',
&&&&&& &'bizRule' =& NULL,
&&&&&& &'data' =& NULL
&& &'user' =& [
&&&&&& &'type' =& Item::TYPE_ROLE,
&& &&&&&'description' =& 'User',
&&&&&& &'children' =& [
&&&&&&&&&& &'guest',
&&&&&&&&&& &'manageThing0', //用户可以编辑thing0
&&&&&& &],
&&&&&& &'bizRule' =& 'return !Yii::$app-&user-&isG',
&&&&&& &'data' =& NULL
&& &'moderator' =& [
&&&&&& &'type' =& Item::TYPE_ROLE,
&&&&&& &'description' =& 'Moderator',
&&&&&& &'children' =& [
&&&&&&&&&& &'user',&&&&&&& &//user能做的他都可以做
&&&&&&&&&& &'manageThing1', //用户可以编辑thing1
&&&&&& &],
&&&&&& &'bizRule' =& NULL,
&&&&&& &'data' =& NULL
&& &'admin' =& [
&&&&&& &'type' =& Item::TYPE_ROLE,
&&&&&& &'description' =& 'Admin',
&&&&&& &'children' =& [
&&&&&&&&&& &'moderator',&& &// 能做moderator可以做的所有东西
&&&&&&&&&& &'manageThing2', // 也可以管理 thing2
&&&&&& &],
&&&&&&&'bizRule' =& NULL,
&&&&&& &'data' =& NULL
&& &'godmode' =& [
&&&&&& &'type' =& Item::TYPE_ROLE,
&&&&&& &'description' =& 'Super admin',
&&&&&& &'children' =& [
&&&&&&&&&& &'admin',&&&&&& &// admin能做的都可以做
&&&&&&&&&& &'manageThing3', // 也可以管理 thing3
&&&&&& &],
&&&&&& &'bizRule' =& NULL,
&&&&&& &'data' =& NULL
现在,您可以从RBAC在控制器的访问控制配置指定的角色
public function behaviors()
&& &return [
&&&&&& &'access' =& [
&&&&&&&&&& &'class' =& 'yii\web\AccessControl',
&&&&&&&&&& &'except' =& ['something'],
&&&&&&&&&& &'rules' =& [
&&&&&&&&&&&&&& &[
&&&&&&&&&&&&&&&&&& &'allow' =& true,
&&&&&&&&&&&&&&&&&& &'roles' =& ['manageThing1'],
&&&&&&&&&&&&&& &],
&&&&&&&&&& &],
&&&&&& &],
另一种方法是调用[[yii\web\User::checkAccess()]]&在适当情况下:
使用DB为基础的存储RBAC
在数据库中存储的RBAC层次是低效率的浪费性能的,但要灵活得多。这是因为他比较容易创造一个良好的管理界面,所以如果你需要的权限结构是由最终用户管理的,数据库是您的首选。
在开始之前,你需要配置数据库连接的数据库组件,完成之后得到的&文件为您的数据库,并执行它。
下一步是配置authManager应用程序组件在应用程序配置文件(web.php或main.php这取决于你使用的模板):
'authManager' =& [
&& &'class' =& 'yii\rbac\DbManager',
&& &'defaultRoles' =& ['guest'],
它是如何工作的
TBD:写一下它的工作原理与图片:)
避免过多的RBAC
为了保持权威性的层次结构简单、高效你应该避免创建和使用过多的节点。大多数时候,简单的检查可以用来代替。对于使用RBAC例如这样的代码
public function editArticle($id)
&$article = Article::find($id);
&if (!$article) {
&& &throw new NotFoundHttpException;
&if (!\Yii::$app-&user-&checkAccess('edit_article', ['article' =& $article])) {
&& &throw new ForbiddenHttpException;
可以被替换为一个不使用RBAC的简单代码
public function editArticle($id)
&& &$article = Article::find(['id' =& $id, 'author_id' =& \Yii::$app-&user-&id]);
&& &if (!$article) {
&&&& &throw new NotFoundHttpException;
&& &// ...
本文翻译自:
阅读(34856) | 评论(2) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
Yii2.0中文开发向导——RBAC(基于角色的访问控制权限)表结构原理分析这也有一篇分析表结构的&/forum.php?mod=viewthread&tid=74&fromuid=2
请问Yii2的文档是您翻译的么?加我们的QQ群一起翻译吧?不是您原创的话,也加进来一起学习提高吧。Yii2兴趣小组,群号:
请登录后评论。请大神指导一下 yii2 的 oauth2 什么玩
- 问答 - Yii Framework 中文社区
请大神指导一下 yii2 的 oauth2 什么玩
2844次浏览
悬赏 10 金钱
请问哪一位大侠 玩过 yii2 的 oauth2
### php composer.phar require --prefer-dist bshaffer/oauth2-server-php "*"
这个都安装好了,表也已经建立好。
然后改怎么玩,请大神指导!(才接触oauth2,好难!不是很懂)
简化模式还要自己写一下,上面没有实现
6o,老大正要弄个这种东西
共 10 条回复
这个东西不错。应该在里面能找到答案,加油吧!
我早上也帮他找了这个,哈哈,所以说6
这个怎么用吗?这是人家写的yii的版本,不过我看不太懂,看得懂教我。。
namespace appinterface\
use yii\web\C
模拟客户端
在hosts里面把这个配好: 客户端和服务器端都放在controllers 同一个文件夹下面的。
class TestoauthController extends Controller {
$tokenuri=""; //请求token的url 可以获取token 、通过codke获取token 、获取refretoken
$client_id =
'testclient';
'testpass';
$redirect = '
$redirect2 = ' 应该和上面的$redirect 一样
public function actionIndex()
$this-&layout =
return $this-&render('index');
public function actionSendoauth()
$token = $this-&actionTest1();
$token = $token['access_token'];
$url = "/oauth/authorize?client_id=".$this-&client_id."&response_type=code&redirect_uri=".$this-&redirect."&access_token=".$token."&redirect_uri2=".$this-&redirect2;
header("Location:".$url);
public function actionGetcode(){
$arr = $this-&actionTest3();
$arr[] = '以后每次调用我们的资源都会对access_token 验证他的合法性,过期时间是1个小时,refresh_token没有过期,期限是10天左右。';
$arr[] = '请储存好您的 access_token 和 refresh_token ,access_token过期后 可以用refresh_token 获取access_token ';
$arr[] = '需要再次获取token和refrentoken可以访问:/testoauth/getrefretoken?refresh_token=您储存的refresh_token';
echo '&pre&';
print_r($arr);
public function actionGetrefretoken(){
$arr = $this-&actionRefresh();
print_r($arr);
//curl -u testclient:testpass
-d "grant_type=password&username=rereadyou&password=111111"
//这条成功了的
模拟这一条 curl -u testclient:testpass
-d grant_type=client_credentials
获取未被验证的 token
@return type
public function actionTest1(){
$data = array('grant_type' =& 'client_credentials','redirect_uri'=&$this-&redirect);
$userpasswd = $this-&client_id.':'.$this-&
$return = $this-&curlpost($this-&tokenuri,$data,$userpasswd);
$return = json_decode($return,true);
重新获取refresh_token与token
@return type
public function actionRefresh(){
$request = Yii::$app-&
$data = array('grant_type' =& 'refresh_token','refresh_token'=&$request-&get('refresh_token'));
$userpasswd = $this-&client_id.':'.$this-&
$return = $this-&curlpost($this-&tokenuri,$data,$userpasswd);
$return = json_decode($return,true);
* 把用户同意后获得的code拿到token里面去验证 再次获取一个token
* @return type
public function actionTest3(){
$request = Yii::$app-&
$data = array('grant_type' =& 'authorization_code','code'=&$request-&get('code'),'redirect_uri'=&$this-&redirect);
$userpasswd = $this-&client_id.':'.$this-&
$return = $this-&curlpost($this-&tokenuri,$data,$userpasswd);
$return = json_decode($return,true);
* @param type $uri
需要post的url
* @param type $data
这个url需要带的参数
* @param type $userpasswd
用户名密码
* @return type
返回返回的数据
public function curlpost($uri,$data,$userpasswd=null){
$ch = curl_init ();
curl_setopt ( $ch, CURLOPT_URL, $uri );
curl_setopt ( $ch, CURLOPT_POST, 1 );
curl_setopt ( $ch, CURLOPT_HEADER, 0 );
if($userpasswd!=null){
curl_setopt ( $ch, CURLOPT_USERPWD, $userpasswd);
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt ( $ch, CURLOPT_POSTFIELDS, $data );
$return = curl_exec ( $ch );
curl_close ( $ch );
namespace appinterface\
use yii\web\C
use common\models\M
use common\helpers\BaseH
模拟服务器端
获取未授权的 token
首先客户端 引导客户点击个链接,在过程中 获取未授权的 token,然后把这token发送给我们的服务器,然后页面跳转在我们的服务起的页面上
这个主要是用的 oauth_clients表 里面的内容 ,字段:client_id 账号,client_secret 密码,
redirect_uri 回调url(在下面注释第三个接口上,要匹配) ,grant_types 权限 里面用空格隔开的 ,scope与user_id没发现有什么用
这oauth_clients表应该弄成可以让第三方自己来注册的表。我们自己后台授权,是否通过。
验证token接口(验证token都可以用这个接口)
这个是验证token(这个token可以是授权的token,也可以是未授权的token )的接口 传参数 access_token
如果用refresh_token 来验证,是通不过的。
成功返回 json_encode(array('success' =& true, 'message' =& 'You accessed my APIs!'))
client_id 是账号
response_type=code 表示用code的验证方式 redirect_uri 在oauth_clients中的字段,一定要写对错了要报错。
*这个是让用户登陆的验证并且授权的接口 可以直接访问,所以先用上面的 验证token接口 来验证token是否合法,合法后再掉用此接口
我们在这个接口让用户填写,用户名和密码,并选择授权给那个客户端(这个接口里面可以写很多逻辑代码)
如果成功 向客户端服务器返回code,并且跳转到客户端的页面链接。这个链接可以是在我们这边注册就写好了的。
//参数是上一步的获取的code,要在30秒内用
//这是客户端拿到上面返回的 code后 主要获取 token 和 refresh_token两个参数 ,这两个都需要客户端的自己保留存储到数据库
并且每次访问我们的接口,都要用一下这个token,我们判断这个token是否合法,合法就访问资源,
由于我们在 客户端注册的时候,我们是可以为客户端设定权限的,同时用户的登录的时候也是有权限的,
我们可以通过这个两个权限来为客户端调用接口时,设定这个接口的权限。
这一步要在获取code后30秒内执行完。
参数是token
返回Array ( [access_token] =& d68fd9de7a5f31ac0420eff89b617be [client_id] =& testclient [user_id] =& 1 [expires] =&
[scope] =& )
获取用户token的信息 返回user_id、client_id、token之间的关联关系,这个user_id是在 用户点击 授权给那个客户端后做的业务逻辑里面加入的。
方便我们当客户端用token来请求资源的时候,我们知道是哪个用户,和哪个客户端,我们就知道用户的权限和客户端的权限,并返回相应的资源。
参数是 refresh_token
一般是用户的token过期后,客户端用refresh_token来掉用此接口,也可以没有过期也掉用此接口。
重新获取token和refresh_token两个参数(并且会自动删除以前的refresh_token), 这两个都需要客户端的自己保留存储到数据库
class OauthController extends Controller
protected $_
public $enableCsrfValidation =
public function beforeAction($action)
if (!parent::beforeAction($action))
$db = Yii::$app-&
$username = $db-&
$password = $db-&
$tablePrefix = $db-&tableP
$charset = $db-&
//ini_set('display_errors',1);
//error_reporting(E_ALL);
$storage = new \OAuth2\Storage\Pdo(
array('dsn' =& $dsn, 'username' =& $username, 'password' =& $password,'options'=&array('tablePrefix'=&$tablePrefix,'charset'=&$charset))
//这个添加前缀的数组在开始测试的时候建议不要加进去
'client_table' =& $tablePrefix.'oauth_clients',
'access_token_table' =& $tablePrefix.'oauth_access_tokens',
'refresh_token_table' =&$tablePrefix. 'oauth_refresh_tokens',
'code_table' =& $tablePrefix.'oauth_authorization_codes',
'user_table' =& $tablePrefix.'oauth_users',
'jwt_table' =&$tablePrefix. 'oauth_jwt',
'jti_table' =& $tablePrefix.'oauth_jti',
'scope_table' =&$tablePrefix. 'oauth_scopes',
'public_key_table' =& $tablePrefix.'oauth_public_keys',
$server = new \OAuth2\Server($storage, array('enforce_state'=&false,'id_lifetime'=& 3600,'access_lifetime' =& 3600));
$server-&addGrantType(new \OAuth2\GrantType\ClientCredentials($storage));
$server-&addGrantType(new \OAuth2\GrantType\AuthorizationCode($storage));
$server-&addGrantType(new \OAuth2\GrantType\RefreshToken($storage,array('always_issue_new_refresh_token' =& true, 'unset_refresh_token_after_use' =& true)));
$server-&addGrantType(new \OAuth2\GrantType\UserCredentials($storage));
$this-&_server = $
// 获取token
public function actionToken()
$this-&_server-&handleTokenRequest(\OAuth2\Request::createFromGlobals())-&send();
//验证token的正确性
public function actionResource()
if (!$this-&_server-&verifyResourceRequest(\OAuth2\Request::createFromGlobals())) {
return $this-&_server-&getResponse()-&send();
echo json_encode(array('success' =& true, 'message' =& 'You accessed my APIs!'));
//获取客户端的授权 并获取 code 再拿这个code 去token 方法里面去再次获取token。
//记到handleAuthorizeRequest()的第4个参数要写进去
public function actionAuthorize()
if (!$this-&_server-&verifyResourceRequest(\OAuth2\Request::createFromGlobals())) {
exit('您的平台的token没有通过验证!');
$request = \OAuth2\Request::createFromGlobals();
$response = new \OAuth2\Response();
if (!$this-&_server-&validateAuthorizeRequest($request, $response)) {
return $response-&send();
if (empty($_POST)) {
return ' &form method="post"&
&li&用户名:&input type="text" name="username" value=""&&/li&
&li&密码:&input type="password" name="passwd" value=""&&/li&
&li&&label&您要授权给testclient平台吗?&/label&&/li&
&li&&input type="submit" name="authorized" value="yes"&&/li&
&li&&input type="submit" name="authorized" value="no"&&/li&
$is_authorized = ($_POST['authorized'] === 'yes');
/*这个里面写业务逻辑*/
$reques = Yii::$app-&
if ($member = Member::findLogin(BaseHelper::encode($reques-&post('username')))){
if (!empty($reques-&post('passwd')) && !empty($member-&password_hash) &&Yii::$app-&security-&validatePassword($reques-&post('passwd'), $member-&password_hash)) {
if(!$isOk){
exit('您的用户名或密码错误');
/*这个里面写业务逻辑*/
$this-&_server-&handleAuthorizeRequest($request, $response, $is_authorized,$member-&id);
//这个$member-&id表示的 是member表里面有的userid(为了以后方便自己查找) 这把token与userid绑定到一起。 通过下面的actionAcc()方法可以看出来。
if ($is_authorized) {
if(strpos('#', $response-&getHttpHeader('Location'))!=false){
$code = substr($response-&getHttpHeader('Location'), strpos($response-&getHttpHeader('Location'), 'code=')+5, 40);
$code = $response-&getHttpHeader('Location');
$arr2 = explode('code=', $code);
$this-&jumpurl($arr2[1]);//跳转回去
//exit("SUCCESS! Authorization Code: $code");
return $response-&send();
* 获取token绑定的值 user_id 与 client_id
function actionAcc(){
$token = $this-&_server-&getAccessTokenData(\OAuth2\Request::createFromGlobals());
echo "User ID associated with this token is {$token['user_id']}";
print_r($token);
* 跳转一个url
function jumpurl($code){
$request = Yii::$app-&
$redirect_uri = $request-&get('redirect_uri2');
header("Location:".$redirect_uri.'?code='.$code);
/*那个方法用到的 view页面
public function actionIndex()
$this-&layout =
return $this-&render('index');
use yii\helpers\H
&?= Html::a('用我们的平台登录', ['/testoauth/sendoauth'], ['class' =& 'btn btn-primary jianquanyi']) ?&
'modules' =& [
'oauth2' =& [
'class' =& 'filsh\yii2\oauth2server\Module',
'tokenParamName' =& 'accessToken',
'tokenAccessLifetime' =& 3600 * 24,
'storageMap' =& [
'user_credentials' =& 'common\models\Member',
'grantTypes' =& [
'user_credentials' =& [
'class' =& 'OAuth2\GrantType\UserCredentials',
'refresh_token' =& [
'class' =& 'OAuth2\GrantType\RefreshToken',
'always_issue_new_refresh_token' =& true
], //这个配置与components在同一级别 这点要注意,和readme.md上的有点不一样。
照着 README.md上面的做
yii migrate --migrationPath=@vendor/filsh/yii2-oauth2-server/migrations
这地方会报错。
解决办法 把这个方法
public function primaryKey($columns) {
return 'PRIMARY KEY (' . $this-&db-&getQueryBuilder()-&buildColumns($columns) . ')';
//粘贴到 这个里面去 \yii\db\Migration
//执行成功后再删除掉这方法
以下网站可供参考,讲的都不错:
这个不错,配上网页翻译,很好!
好的,我去看看
请点击下面的链接
共 3 条回复
大哥不是这样的,是自己做个oauth2 server 不是去用其它平台的第三方登陆。是自己做个第三方登录,然后让其它平台来使用。
这个里面有一些,基本能能用,但是还是不够用,但是没有把yii2的Oauth2-server的功能好好的利用上。
请大神们能帮帮忙!
刚才发错了链接,是这个:
您需要登录后才可以回答。 |

我要回帖

更多关于 yii2 判断post请求 的文章

 

随机推荐