哨兵2为laravel 4 ACL

时间:2013-12-12 04:15:32

标签: php laravel-4 cartalyst-sentry

Laravel 4和Sentry 2用于ACL 注意:我使用laravel函数进行登录,但只需要为了ACL而使用sentry来检查权限

希望实现这一目标:

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 

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

如果您有兴趣,可以使用laravel包将Sentry与管理面板集成:https://github.com/intrip/laravel-authentication-acl

答案 2 :(得分:0)

此处的问题是Laravel Auth和Sentry不使用相同的变量来存储用户信息,因此当您使用Laravel的Auth::attempt()进行身份验证时,Sentry::getUser()仍会返回null

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

最简单的解决方案是采用全有或全无的身份验证方法;或者将Laravel部分替换为Sentry,或者反之亦然。

我在本机Laravel中实现基于角色的ACL的一种方法是向数据库添加roles表,其上有name列+数据透视表,然后添加{{3}到我的用户驱动程序。该代码允许我通过Auth::user()->is(["admin", "publisher"])等语法检查ACL。