从 android/ios 使用 Symfony 进行身份验证

Posted

技术标签:

【中文标题】从 android/ios 使用 Symfony 进行身份验证【英文标题】:Authenticate with Symfony from android/ios 【发布时间】:2014-03-29 11:24:56 【问题描述】:

我有一个 php Symfony Web 应用程序,它使用基于表单的身份验证,现在我尝试在 android 本机应用程序中访问它的一些数据。首先,我需要从我的 android 本机应用程序进行身份验证,但我无法针对 Symfony 应用程序进行实用的身份验证。

经过大量调试后,我发现当我尝试从 Android 对 Symfony 进行身份验证时,它似乎总是重定向到我能够通过 Fiddler 代理捕获的登录页面。我还尝试更改 security.yml 以使用基本身份验证移动设备,但似乎没有任何效果。

下面是我的security.yml

security:
acl:
    connection: default

role_hierarchy:
    ROLE_ADMIN:       ROLE_USER
    ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]

encoders:
    Docova\DocovaBundle\Entity\UserAccounts: plaintext
providers:
    chain_provider:
        chain:
            providers: [docova_second, docova_main]
    docova_main:
        id: docova.security.user.provider
    docova_second:
       entity:  class: DocovaBundle:UserAccounts
firewalls:
    login:
        pattern:  ^/demo/secured/login$
        security: false

    docova:
        pattern:     /.*
        form_login:
            login_path: %d.login_path%
            check_path: %d.check_path%
            default_target_path: %d.default_target_path%
            success_handler: docova.security.authentication.success_handler
        logout:
            path:   /Docova/logout
            target: /Docova
        anonymous: true
        security: true
        docova: true

    mobile:
        pattern:     /.*
        http_basic: ~

access_control:
    -  path: /Docova/login, roles: IS_AUTHENTICATED_ANONYMOUSLY 
    -  path: ^/Docova, roles: ROLE_USER 

这是android使用basic进行身份验证的java代码:

/*
 * Get input stream from requested url
 */
public InputStream getInputStream(String urlPath)
    InputStream is=null;
    HttpURLConnection httpConn = null;
    FileOutputStream fos=null;

        try 

        int responseCode;
            String responseContentType;
            urlPath = "http://linux.dlitools.com/Symfony/web/app.php/Docova/mobileAuthenticateUser.xml";
            URL url = new URL(urlPath);
            httpConn = (HttpURLConnection) url.openConnection();
            httpConn.setRequestMethod("GET");
            httpConn.setDoInput(true);

            //prepare login string for basic auth
            String authString = username + ":" + password;
            // encode base 64 for basic auth
            String encoded=Base64.encodeToString(authString.getBytes(), Base64.NO_WRAP);

            //set required properties for basic
            httpConn.setRequestProperty("Authorization", "Basic " + encoded);
            httpConn.setDoOutput(true);
            httpConn.setRequestProperty("Content-type", "text/xml"); 

            //open connection and get input stream
            httpConn.connect(); 
            is = httpConn.getInputStream();

            int lenghtOfFile = httpConn.getContentLength(); 
            responseContentType=httpConn.getContentType(); //***** need to find out more on this ******
            responseCode= httpConn.getResponseCode();

            if (!responseContentType.equals("text/xml") )
                is=null;
            

            Log.d(TAG, "The response Content Type is: " + responseContentType);
            Log.d(TAG, "The response code is: " + responseCode);
            Log.d(TAG, "getXmlInputStream() : END");
    catch(Exception e)
            errorMsg=errorMsg+"\n\n Exception happend: "+" " +  e.toString() ;

        

    return is;

如果有人能指出我正确的方向,我将不胜感激......是否需要在 Symfony 安全性或某些配置中打开一个设置,以允许对 Android 等移动应用程序进行基本身份验证。

谢谢。

【问题讨论】:

您正在使用 2 个防火墙,一个用于基本身份验证,一个用于表单登录。通过基本身份验证后,您还需要通过表单登录。使用 2 个防火墙时需要小心,因为在进行身份验证时都会检查它们。 我有 2 个防火墙的原因是因为 sympfony 出于某种原因不允许以编程方式登录表单,所以我添加了基本身份验证只是为了看看它是否可以工作。顺便说一句,我尝试发送基本授权和帖子,但也没有用。 最好的办法是实现自定义身份验证提供程序或类似 FOSOAuthServerBundle 的东西。这样您就可以使用相同的防火墙以编程方式登录 谢谢建议。您能否发布自定义身份验证提供程序的示例,thnx。 【参考方案1】:

在文档中有一个将 WSSE 实现为自定义身份验证提供程序的完整示例。看看Custom Authentication Provider。我过去已经实现了这一点,但我发现实现 FOSOAuthServerBundle 更方便。但是试一试,他们都应该做你想做的事。

【讨论】:

Sehael,感谢您的快速回复。我不认为我可以选择创建自己的提供程序,但会尝试说服我的客户......因为这是客户端应用程序。我必须让它与目前可用的东西一起工作,这很奇怪 Symfony 不允许基于表单的身份验证有问题......再次感谢您的所有建议。

以上是关于从 android/ios 使用 Symfony 进行身份验证的主要内容,如果未能解决你的问题,请参考以下文章

使用 Symfony 路由从 .htaccess 重写 URL

如何使用 Axios 将图像从 VueJS 上传到 Symfony?

从 Symfony 中的控制器返回 JSON 数组

如何使用教义/symfony4 从数据库中获取(连接)两条记录

Symfony 4.4如何使用collectionType从0个字段开始

symfony2:试图从命名空间加载类“Memcache”