阿帕奇shiro与球衣

时间:2014-10-07 02:03:50

标签: authentication jersey shiro

我正在使用泽西建立一个Web服务应用程序。 使用apache shiro进行授权/认证。

我找到了一些教程,展示了如何在Web应用中使用apache shiro。它们使用带有用户名和密码字段的.jsp页面显示登录方法,而这个.jsp页面在shiro.ini中配置如下:

[main]

shiro.loginUrl = /login.jsp

[urls]
/login.jsp = authc
/logout = logout

我想知道如何在没有任何.jsp页面的情况下进行此身份验证,因为我的项目只有Web服务。所以我认为我需要一个登录服务,而不是我创建一个:

@POST
@Path("/login")
public Response login(@FormParam("username") final String username, @FormParam("password") final String password, @FormParam("remember") final boolean remember) {

    final Subject currentUser = SecurityUtils.getSubject();

    if (!currentUser.isAuthenticated()) {
        final UsernamePasswordToken token = new UsernamePasswordToken(username, password);
        try {
            token.setRememberMe(remember);
            currentUser.login(token);
        } catch (final AuthenticationException e) {
            return Response.status(Status.BAD_REQUEST).entity("Usuário ou senha inválido").build();
        }
    }

这是我的shiro.ini conf:

[urls]
/security/login = anon
/security/isAuthenticated = anon
/** = authcBasic

一旦用户无法通过身份验证登录i include / security / login = anon。

这是在Web服务环境中使用apache shiro对用户进行身份验证的正确方法吗?

1 个答案:

答案 0 :(得分:0)

您不需要登录服务。实际上,验证和使用服务应该是两件不同的事情。你需要做的是:

  • 了解您要认证的页面
  • 配置Shiro通过您的身份验证方法对这些页面进行身份验证。

你的shiro.ini会看起来像这样:

[main]
myRealm = com.my.package.MyRealm
myAuthc = com.my.package.MyAuthenticationFilter

[urls]
/public/** = anon
/** = myAuthc

您需要同时实现领域和过滤器。您可以使用AuthenticatingFilter甚至其中一个子类来实现过滤器,例如BasicHttpAuthenticationFilter。可以使用AuthenticatingRealm类来实现领域。

更多关于领域here以及更多关于Shiro on web here的信息。请注意,要使您的过滤器可用,您需要做的事情基本上是在web.xml上设置过滤器

对域和过滤器进行编码后,您的代码应该按预期工作。根据shiro.ini的定义,任何以public/开头的路径都不会通过身份验证,所有其他路径都将通过com.my.package.MyAuthenticationFilter进行身份验证。请注意,订单很重要:如果您首先定义/** = myAuthc行,它将对所有内容进行身份验证,包括以/public/开头的路径。