我正在使用泽西建立一个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对用户进行身份验证的正确方法吗?
答案 0 :(得分:0)
您不需要登录服务。实际上,验证和使用服务应该是两件不同的事情。你需要做的是:
你的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/
开头的路径。