2013-12-12 131 views
0

Laravel 4哨兵2 ACL 注:我使用laravel功能进行登录,但需要放哨只为ACL的目的,检查权限哨兵2 laravel 4 ACL

要实现这一点:

if (Sentry::getUser()->hasAnyAccess(['system'])) 
{ 
echo 'has access to system'; 
} 

,但我不断收到以下错误:

Sentry::getUser()->hasAnyAccess(['system']); //this hits error: Call to a member function hasAnyAccess() on a non-object 

回答

2

方式Sentry2不认证不符合Laravel内置的身份验证系统兼容。据我了解Laravel的内置身份验证系统和Sentry2设置不同的会话密钥来存储登录用户的详细信息。因此,不可能使用Sentry2来获取有关laravel认证用户的详细信息。但是,鉴于您对User模型和Sentry2使用的模型都使用相同的数据库表,这应该可以工作。

Sentry::findById(Auth::user()->id)->hasAnyAccess(['system']) 

如果你想使用内置auth兼容方式的Sentry,你可能想要检查这个包。

https://bitbucket.org/hampel/sentry-auth-driver-for-laravel

0

这里的问题是,Laravel验证和哨兵不使用存储用户信息相同的变量,所以当您使用Laravel的Auth::attempt()进行身份验证时,Sentry::getUser()仍然会返回null

反之亦然 - 如果您使用Sentry::authenticate()进行身份验证,则Auth::user()不会返回对象。

最简单的解决方案是做一个全有或全无的方法进行认证;要么将Laravel部分换成哨兵,要么换成反之。我实现了基于角色的访问控制列表在本地Laravel

一种方式是通过添加roles表,其中有一个name列上+数据透视表,然后加入this access checking code到我的用户驱动程序数据库。该代码允许我通过类似Auth::user()->is(["admin", "publisher"])等语法来检查ACL。