0

我正在关注并使用来自Java SQL Adapter的Custom Authenticator 和 Login Module和 UserAdapter的示例代码。

我想在认证后获取用户列表。

我的配置authenticationConfig.xml文件

<realms>
    <realm loginModule="CustomLoginModule" name="CustomAuthenticatorRealm">
        <className>com.mypackage.MyCustomAuthenticator</className>
    </realm>
</realms>

<loginModules>
    <loginModule name="CustomLoginModule">
        <className>com.mypackage.MyCustomLoginModule</className>
    </loginModule>
</loginModules>

我配置 Java 适配器,UserAdapterResource.java文件

@GET
@Produces("application/json")
@OAuthSecurity(scope="CustomAuthenticatorRealm")
public Response getAllUsers() throws SQLException{
    JSONArray results = new JSONArray();
    Connection con = ds.getConnection();
    PreparedStatement getAllUsers = con.prepareStatement("SELECT * FROM users");
    ResultSet data = getAllUsers.executeQuery();

    while(data.next()){
        JSONObject item = new JSONObject();
        item.put("userId", data.getString("userId"));
        item.put("firstName", data.getString("firstName"));
        item.put("lastName", data.getString("lastName"));
        item.put("password", data.getString("password"));

        results.add(item);
    }

    getAllUsers.close();
    con.close();

    return Response.ok(results).build();
}

但是当我在客户端调用上面的过程时,它仍然返回一个不需要身份验证的响应,同时它必须显示一个登录模块

4

1 回答 1

1

从您的代码中,您只有该CustomAuthenticatorRealm领域的质询处理程序。为什么不更新您的适配器并使用相同的领域保护它,而不是使用myRealm.

更新UserAdapterResource.java骨架

@Path("/")
public class UserAdapterResource {
    // ... 

    @POST
    @OAuthSecurity(scope="CustomAuthenticatorRealm")
    public Response createUser(@FormParam("userId") String userId, 
                                @FormParam("firstName") String firstName, 
                                @FormParam("lastName") String lastName, 
                                @FormParam("password") String password) 
                                        throws SQLException{
        // ...
    }

    @GET
    @Produces("application/json")
    @Path("/{userId}")
    public Response getUser(@PathParam("userId") String userId) throws SQLException{
        // ...
    }

    @GET
    @Produces("application/json")
    @OAuthSecurity(scope="CustomAuthenticatorRealm")
    public Response getAllUsers() throws SQLException{
        // ...
    }

    // it's a good practice to protect this operation
    @PUT
    @Path("/{userId}")
    @OAuthSecurity(scope="CustomAuthenticatorRealm")
    public Response updateUser(@PathParam("userId") String userId, 
                                @FormParam("firstName") String firstName, 
                                @FormParam("lastName") String lastName, 
                                @FormParam("password") String password) 
                                        throws SQLException{
        // ...

    }

    // it's a good practice to protect this operation
    @DELETE
    @Path("/{userId}")
    @OAuthSecurity(scope="CustomAuthenticatorRealm")
    public Response deleteUser(@PathParam("userId") String userId) throws SQLException {
        // ...
    }

}

通过这些更改,当应用程序启动时,它将在显示用户列表之前显示登录表单以进行身份​​验证。

更新:

Java 适配器保护正在使用 OAuth,因此 MobileFirst 服务器发出一个令牌进行身份验证。这个令牌有一个过期的生命周期。注销领域不会影响令牌。

根据您的需要实现此功能的一种方法是将令牌的 TTL(生存时间)减少到 10 或 15 秒(或任何您想要的时间)。你可以通过expirationInSeconds在你的登录模块里面设置属性来做到这一点authenticationConfig.xml

身份验证配置.xml

    <!-- token will expire 10 seconds after being issued -->
    <loginModule name="CustomLoginModule" expirationInSeconds="10">
        <className>com.mypackage.MyCustomLoginModule</className>
    </loginModule>

如果自应用程序通过适配器调用或任何其他方法连接到服务器后已过去 10 秒,则用户将需要重新进行身份验证。

于 2015-04-18T19:39:46.603 回答