登录助手组件 SmartFoxServer 2X

»登录助手组件

几乎每个应用程序都需要基于密码的用户访问,并且编写处理客户端参数的代码并且对数据库进行检查是相当乏味且重复的。

Login Assistant组件是一个帮助类,可帮助开发人员创建数据库驱动的登录系统,而无需编写自己的数据库访问代码。

简而言之,这是如何工作的:

在应用程序的区域中配置DBManager
在扩展的init()方法中实例化组件
配置组件

»部署Login Assistant组件

如果您正在使用SmartFoxServer 2X v2.7.0或更高版本,请跳过此步骤,因为组件已可用。
否则,为了激活SmartFoxServer 2X安装中的组件,您需要做的只是:

在这里下载组件
将提供的jar文件解压缩到SFS2X / lib /文件夹中
重新启动SmartFoxServer 2X

»基本用法

开始之前,请确保在Zone配置中配置数据库访问。为此,请打开SFS2X AdminTool,启动Zone Configurator模块并选择Database Manager选项卡。您可以在本文档页面中找到有关如何继续操作的更多详细信息。

对于这个例子,我们将使用一个简单的用户表,其中包含以下字段:
d name pword email
1 Kermit thefrog kermit@muppets.com
2 Gonzo thegreat gonzo@muppets.com
3 Fozzie thebear fozzie@muppets.com
4 MissPiggy thepig piggy@muppets.com

下一步我们创建一个新的扩展,并在init()方法中使用这个代码:

public class MuppetsExtension extends SFSExtension
{
    private LoginAssistantComponent lac;

    @Override
    public void init()
    {
        lac = new LoginAssistantComponent(this);

        // Configure the component 配置组件 
        lac.getConfig().loginTable = "muppets";
        lac.getConfig().userNameField = "name";
        lac.getConfig().passwordField = "pword";
    }

    public void destroy()
    {
        lac.destroy();
    }
}

我们所做的只是通过指定要使用的表的名称和表示用户名和密码的字段的名称来简单地配置组件。 Voilà! 该组件现在配置为使用正确的字段,并将照顾检查凭据,调度错误并针对SQL注入对用户数据进行消毒。
»稍高一些的病例

假设我们有一个稍微复杂的情况,用户将使用电子邮件地址进行登录,但系统中的用户名必须与数据库中的名称字段相关联。 此外,我们还要确保用户名检查是区分大小写的。

实际上,默认情况下,大多数数据库将以非区分大小写的方式比较字符串,除非使用特定的排序规则。 登录助手可以配置为使用DB中的特定字段作为登录名,让我们看看如何完成:

@Override
public void init()
{
    lac = new LoginAssistantComponent(this);

    // Configure the component
    lac.getConfig().loginTable = "muppets";
    lac.getConfig().userNameField = "email";
    lac.getConfig().passwordField = "pword";

    lac.getConfig().nickNameField = "name";
    lac.getConfig().useCaseSensitiveNameChecks = true;
}

所有这一切只是一些额外的代码行来表示昵称字段并打开区分大小写的检查。

注意
如果您有兴趣了解更多关于数据库字符串相等和归类的信息,请查看这些外部资源:

»StackOverflow:SQL区分大小写字符串比较
»MySQL:字符串搜索中的案例灵敏度
“ 高级功能

让我们再试一次呢。 假设我们的数据库包含几个额外的字段:头像图像和指示用户是否具有主持人权限的标志。
id name pword email avatar isMod
1 Kermit thefrog kermit@muppets.com kermit.jpg Y
2 Gonzo thegreat gonzo@muppets.com gonzo.jpg N
3 Fozzie thebear fozzie@muppets.com fozzie.png Y
4 Miss Piggy thepig piggy@muppets.com piggy.png N
我们将图像名称存储在客户端的Session对象内,以便当我们收到USER_JOIN_ZONE事件时,我们可以通过用户变量设置图像。 另外,如果设置了数据库标志,我们希望能够将客户端设置为主持人。

登录助手提供了一种简单的方法,可以通过preProcessPlugin和postProcessPlugin类来检查凭据之前和之后的自定义逻辑。 让我们看看这是如何工作的:

@Override
public void init()
{
    lac = new LoginAssistantComponent(this);

    // Configure the component配置组件
    lac.getConfig().loginTable = "muppets";
    lac.getConfig().userNameField = "email";
    lac.getConfig().passwordField = "pword";
    lac.getConfig().nickNameField = "name";
    lac.getConfig().useCaseSensitiveNameChecks = true;

    lac.getConfig().extraFields = Arrays.asList("avatar", "isMod");

    lac.getConfig().postProcessPlugin = new ILoginAssistantPlugin ()
    {
        public void execute(LoginData loginData)
        {
            ISFSObject fields = loginData.extraFields;

            String avatarPic = fields.getUtfString("avatar");
            boolean isMod = fields.getUtfString("isMod").equalsIgnoreCase("Y");

            // Store avatar in session object将头像存储在会话对象中
            loginData.session.setProperty("avatar", avatarPic)

            // Set client as Moderator将客户端设置为版主
            if (isMod)
                loginData.session.setProperty("$permission", DefaultPermissionProfile.MODERATOR);
        }
    };
}

我们添加了一个名为extraFields的新配置参数,其中包含我们要在登录时选择的自定义字段名称列表。

在下一行中,为了方便起见,我们通过内联声明来传递postProcessPlugin类,作为匿名类。该类需要实现声明一个execute()方法的ILoginAssistantPlugin接口。

正如你可以看到在这个方法,我们传递所有相关的登录数据,包括从数据库提取的所有字段(作为SFSObject)和客户端的会话。通过这种方式,将额外的逻辑应用于登录过程非常简单,而无需编写自定义的登录处理程序。

您可以通过查询com.smartfoxserver.v2.components.login软件包下的服务器端javadoc来查找有关本示例中使用的所有类的详细信息。
自2.10.0起

»自定义密码检查和加密

由于SmartFoxServer 2X 2.10,我们已经将TLS加密添加到协议中,该协议打开了自定义处理密码检查的大门。

在协议加密(版本<2.10)之前,只需使用质询握手身份验证协议(CHAP)在LoginRequest中对密码进行加密,方法是使用散列算法。这在传输过程中使密码非常安全,但不允许开发人员在数据库中使用密码盐化。

通过协议加密,密码可以发送,无需哈希,绕过CHAP,并允许服务器扩展接收原始密码,然后可以将其盐化并存储在数据库中。

要绕过盐,您需要使用SmartFoxServer 2X 2.10(或更高版本),并在配置中将LoginAssistant的新customPasswordCheck标志设置为true。

@Override
public void init()
{
    lac = new LoginAssistantComponent(this);

    // Configure the component配置组件
    lac.getConfig().loginTable = "muppets";
    ...
    ...
    lac.getConfig().customPasswordCheck = true;
}

这反过来又允许我们在LoginRequest中作为自定义SFSObject的字段发送密码,并在PreProcess插件中处理它。

这是客户端应该如何发送密码:

var params:ISFSObject = new SFSObject();
params.putUtfString("passwd", tf_password.text);
sfs.send(new LoginRequest(ti_userName.text, "", sfs.config.zone, params));

重要的是要注意,我们将密码作为LoginRequest中可选SFSObject的自定义字段发送。 只要客户端和服务器端都使用相同的字符串,则字段名称可以是任何标识符。

在服务器端,我们必须注意在PreProcess插件中验证密码:

class LoginPreProcess implements ILoginAssistantPlugin
{
    @Override
    public void execute(LoginData ld)
    {
        String clientPass = ld.clientIncomingData.getUtfString("passwd");

        // Let's see if the password from the DB matches that of the user 看看DB中的密码是否与用户密码相匹配
        if (!ld.password.equals(clientpass))
            throw new PasswordCheckException();

        // Success!成功
    }
}

这很简单我们使用我们选择的密钥名称从可选的SFSObject获取密码,并从DB中检查密码。如果它们不匹配,我们只需要提高PasswordCheckException来中断流程。这反过来又会通知客户使用正常的LOGIN_ERROR事件。

否则,如果条件满足我们完成了。 LoginAssistant流程将继续其余的逻辑,客户端将被登录。

注意:如果要使用这种新模式,我们强烈建议您激活Zone配置(AdminTool> Zone Configurator)中的useEncryption标志,以确保服务器只接受加密的连接,从而隐藏来自可能的eavedroppers的通信。
»处理错误

与错误凭据相关的错误,禁止访问,重复的用户名等都由Login Assistant组件使用标准的SmartFoxServer 2X规则处理。这意味着所有错误消息都可以通过SFSErrorCodes类在客户端进行自定义。

开发人员负责处理异常的唯一地方在于预处理和后处理插件。这些类中的任何运行时异常将传播到SFS2X API线程的顶端,并被捕获并记录在那里。这也意味着它们将中断登录流程,因此由您决定哪些异常需要被捕获(为了不中断流程),哪些可以停止进程。

翻译自http://docs2x.smartfoxserver.com/DevelopmentBasics/login-assistant

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值