认证
认证
身份验证
简介
Masonite 带有一个开箱即用的身份验证。没有什么是太固执己见而不是限制性的,所以 Masonite 让它真正可定制,为您提供了一个很好的起点。
身份验证的概念是「警卫」概念。防护只是针对不同场景的身份验证逻辑。例如,如果要构建 API,则可能具有api
防护,但如果要为普通 Web 应用程序构建,则可以使用web
防护。您可以在不同的防护后放置不同的路由,以获得最高级别的控制。
配置
有一个config / auth.py
配置文件,可用于设置 Masonite 项目的身份验证行为。默认配置如下所示:
AUTH = {
'defaults': {
'guard': env('AUTH_GUARD', 'web')
},
'guards': {
'web': {
'driver': 'cookie',
'model': User,
'drivers': { # 'cookie', 'jwt'
'jwt': {
'reauthentication': True,
'lifetime': '5 minutes'
}
}
},
}
}
您可以在defaults
键中设置要使用的默认防护。在这里,您可以根据需要在guards
键中使用哪种防护来设置各种不同的设置。每个防护都有一些不同的设置,例如防护将使用的driver
,model
,然后是此处的driver
设置。
如果要将身份验证模型更改为例如Company
模型,请随时在此配置文件中进行操作。
这看起来像:
from app.Company import Company
AUTH = {
'defaults': {
'guard': env('AUTH_GUARD', 'web')
},
'guards': {
'web': {
'driver': 'cookie',
'model': Company,
'drivers': { # 'cookie', 'jwt'
'jwt': {
'reauthentication': True,
'lifetime': '5 minutes'
}
}
},
}
}
Cookie 驱动程序
cookie 驱动程序将令牌设置为 cookie,然后在每次请求时从数据库中获取用户。对于大多数应用程序来说,这很好,尽管您为获取用户而对每个请求都进行了附加查询。
这是最基本的身份验证驱动程序。
JWT 驱动程序
JWT 驱动程序会将加密的 JWT 令牌与所有经过身份验证的用户信息一起存储在 cookie 中。然后,当经过身份验证的用户转到该页面时,JWT 令牌将被解密并填充用户模型上的数据,而无需调用数据库。将此选项用于您不希望在每次请求时进行额外数据库调用的高流量站点。
您还可以设置 2 个选项。第一个选项是 JWT 令牌过期的时间。默认情况下是 5 分钟,但您可以将其延长:
'jwt': {
'reauthentication': True,
'lifetime': '5 minutes'
}
第二个选项是用户是否应该在令牌过期后使用数据库重新进行身份验证。如果设置为False
,则令牌将继续继续填充用户模型并设置新令牌,而无需接触数据库。如果设置为True
,它将取消令牌并使用数据库重新进行身份验证以创建新令牌。
身份验证模型
默认的身份验证模型是app / User
模型,该模型具有现成的__ auth __
类属性。该属性应设置为用户登录时要进行身份验证的列。
身份验证列
默认情况下,您的app / User
模型将默认为电子邮件
列,但如果您希望将其更改为其他列,如name
,则可以在此处进行操作。这将使您的模型看起来像:
class User(Model):
__fillable__ = ['name', 'email', 'password']
__auth__ = 'name'
多个身份验证列
有时您的应用程序能够通过电子邮件或用户名登录。您可以通过将__ auth __
属性指定为列列表来执行此操作:
class User(Model):
__fillable__ = ['name', 'email', 'password']
__auth__ = ['name', 'email']
现在,您可以执行“请输入用户名或电子邮件”之类的操作。
密码栏
默认情况下,Masonite 将使用password
列作为密码进行身份验证。某些应用程序可能已更改。例如,您的特定应用程序可能正在使用token
列进行身份验证。
您可以通过将__ password __
属性指定为列名来更改密码列:
class User(Model):
__fillable__ = ['name', 'email', 'password']
__auth__ = ['name']
__password__ = 'token'
验证模型
如果要验证模型,可以使用 Masonite 随附的Auth
类。这只是一个用于通过.login()
方法对模型进行身份验证的类。
为了对模型进行身份验证,该类将类似于:
from masonite.auth import Auth
def show(self, request: Request, auth: Auth):
auth.login('user@email.com', 'password')
这将找到具有所提供用户名的模型,使用bcrypt
检查密码是否匹配并返回模型。如果找不到或密码不匹配,它将返回False
。
同样,所有身份验证模型都需要具有
password
列。可以使用__ auth __
类属性在模型中指定用于认证的列,例如用户名或电子邮件字段。
更改身份验证列
您可以通过简单地更改__ auth __
类属性的列值来更改要认证的列。这看起来像:
class User(Model):
__fillable__ = ['name', 'email', 'password']
__auth__ = 'email'
现在,它将在email
列中查找并检查该列和密码。认证列默认为电子邮件
。
更改防护
以上示例将使用默认防护。您可以通过以下操作动态更改防护:
from masonite.auth import Auth
def show(self, request: Request, auth: Auth):
auth.guard('api').login('user@email.com', 'password')
现在将使用api
防护(如果存在的话)。
更改路由中的防护
Masonite 随附了一个防护中间件,使您可以根据路线切换防护。例如,如果您有一个 API 路由,那么可能需要使用已创建的api
防护:
Get('/api/users').middleware('guard:api')
或者您可能需要使用路由组:
RouteGroup([
Get('/api/users'),
Get('/api/settings'),
Get('/api/posts'),
], middleware=('guard:api',))
创建身份验证系统
如果您选择这样做,您当然可以随意滚动自己的身份验证系统,但是 Masonite 带有一个现成的,但默认情况下不提供的身份验证系统。为了支持此身份验证系统,您可以使用craft
命令:
$ craft auth
这将为您创建一些控制器、视图和路由。此命令应主要在全新安装的 Masonite 上使用,但只要控制器的名称与正在搭建的控制器名称不同,就不会有任何问题。
搭建的视图将位于resources / templates / auth
下。
运行craft auth
命令后,只需运行服务器并导航到http:/// localhost:8000 / login
,现在就有了登录、注册和仪表板。很酷吧?
检索经过身份验证的用户
Masonite 附带了LoadUserMiddleware
中间件,如果用户通过身份验证,它将把用户加载到请求中。 Masonite 使用token
cookie 来检索使用表中的remember_token
列的用户。
使用此LoadUserMiddleware
中间件,您可以使用以下方法检索当前用户:
def show(self, request: Request):
request.user()
如果您不希望使用中间件将用户加载到请求中,则可以使用Auth
类再次获取请求
from masonite.auth import Auth
def show(self, request: Request, auth: Auth):
auth.user()
检查用户是否已通过身份验证
如果您只想检查用户是否已通过身份验证,则如果用户未通过身份验证,则request.user()
或auth.user()
将返回False
。看起来像:
def show(self, request: Request):
if request.user():
user_email = request.user().email
登录
您可以使用 Auth 类轻松地将用户登录到您的应用程序:
from masonite.auth import Auth
def show(self, request: Request, auth: Auth):
auth.login(
request.input('username'),
request.input('password')
)
请注意,您提供的用户名必须采用模型上
__ auth __
属性的任何格式。如果电子邮件地址是「用户名」,则用户将需要提供其电子邮件地址。
通过 ID 登录
如果您需要更直接的内部控制,则可以通过模型 ID 登录:
from masonite.auth import Auth
def show(self):
auth.login_by_id(1)
现在,您以ID为1的用户身份登录。
登录一次
如果您只想登录「一次」,可能只是为了验证某个操作或验证用户是否可以提供正确的凭据,就可以登录而无需将任何 Cookie 保存到浏览器中:
from masonite.auth import Auth
def show(self):
auth.once().login_by_id(1)
您也可以对常规登录方法执行相同的操作:
from masonite.auth import Auth
def show(self, request: Request, auth: Auth):
auth.once().login(
request.input('username'),
request.input('password')
)
注册用户
您还可以使用Auth
类上的register()
方法轻松注册用户:
from masonite.auth import Auth
def show(self, auth: Auth):
auth.register({
'name': 'Joe',
'email': 'joe@email.com',
'password': 'secret'
})
保护路由
Masonite 附带了身份验证中间件。您可以将此中间件用作路由中间件,以保护某些路由不受未经身份验证的用户访问。这对于尝试转到仪表板的用户重定向到登录页非常有用。
您可以像下面这样在路由文件中使用此中间件:
Get().route('/dashboard', 'DashboardController@show').middleware('auth')
默认情况下,它将重定向到名为login
的路由。如果希望将用户重定向到其他路由或其他 URI,可以在app / http / middleware / AuthenticationMiddleware.py
中编辑中间件。
注销用户
如果希望结束该用户的会话并注销,则可以使用Auth
类来完成。看起来像:
auth.logout()
这将删除登录时设置的cookie。这不会将用户重定向到他们需要去的地方。完整的注销视图可能类似于:
def logout(self, request: Request, auth: Auth):
auth.logout()
return request.redirect('/login')
验证用户的电子邮件
如果您希望要求用户验证其电子邮件地址并自动向他们发送电子邮件,则可以扩展User
模型。
from masonite.auth import MustVerifyEmail
class User(Model, MustVerifyEmail):
__fillable__ = ['name', 'email', 'password']
__auth__ = 'name'
当用户注册后,将自动向他们发送电子邮件,要求他们确认电子邮件地址。
重定向未验证的用户
您可以使用VerifyEmailMiddleware
类重定向未验证的用户。
您可以在路由文件中使用该中间件,如下所示:
Get().route('/dashboard', 'DashboardController@show').middleware('verified')
好极了!您已经掌握了 Masonite 如何使用身份验证。请记住,这只是开箱即用的功能,您可以创建一个完全不同的身份验证系统,但这对于大多数应用程序而言已足够。
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。