如何正确验证 AngularJS 客户端到服务器的身份

2024-03-06

我正在构建一个使用 RESTful API (Jersey) 的 AngularJS Web 应用程序。

在服务器端,我使用 Java 应用程序服务器(具体为 Glassfish 4)。

我的设置如下:

  • AngularJS webapp 作为单个 war 文件部署到 Java EE 应用程序服务器。
  • RESTfulAPI(和后端逻辑)也作为 war 文件部署到同一 Java EE 应用程序服务器。
  • AngularJS Web 应用程序调用 REST API 来获取所需的数据。
  • The RESTful API:
    • /api/public/*用于公共不受限制的访问(例如 /api/public/users/signup 注册为新用户)。任何用户都可以访问该区域。无需登录
    • /api/private/*用于受限访问(例如 /api/private/account/{id} 以检索某些帐户特定数据)
  • 私有资源受到 Java EE 内部安全概念的保护(有关 web.xml 的详细信息,请参阅下文)。

Web.xml

<security-constraint>
    <web-resource-collection>
        <web-resource-name>PRIVATE REST API</web-resource-name>
        <url-pattern>/private/*</url-pattern>
        <http-method>GET</http-method>
        <http-method>POST</http-method>
        <http-method>HEAD</http-method>
        <http-method>PUT</http-method>
        <http-method>OPTIONS</http-method>
        <http-method>TRACE</http-method>
        <http-method>DELETE</http-method>
    </web-resource-collection>
    <auth-constraint>
        <description>Have to be a USER</description>
        <role-name>USERS</role-name>
    </auth-constraint>
</security-constraint>
<login-config>
    <auth-method>BASIC</auth-method>
    <realm-name>userauth</realm-name>
</login-config>
<security-role>
    <description/>
    <role-name>USERS</role-name>
</security-role>

此设置适用于我,但前提是我在浏览器中手动调用 URL。 如果我未通过身份验证并访问安全区域,浏览器会要求输入用户名和密码。如果提供的凭据有效,我就可以访问受限区域:很好。

但是我如何让它与 AngularJS 一起工作呢? 要登录,需要调用 POST API:/api/public/users/login您必须提供表单中的凭据(用户名和密码)。

客户端代码是:

ctrls.controller('LoginController', function($scope, $http, $log, $location, UserService, RemoteServerHelperService) {
    $scope.loginDataWrong = undefined;
    $scope.login = function(credentials) {
    $http.post(RemoteServerHelperService.buildURL('/public/users/login'), credentials)
        .success(function (data, status) {
            UserService.setLoggedIn(credentials.email);
            $scope.loginDataWrong = undefined;
            $location.path('/app');
            $log.info("login attempt: successfull. User.loggedIn:" + UserService.isLoggedIn());
        }).error(function (data, status, headers, config) {
            UserService.invalidate();
            $scope.loginDataWrong = true;
            $log.info("login attempt: failed. User.loggedIn:" + UserService.isLoggedIn());
        });
    };
});

客户端代码似乎可以工作。我还制定了一些路线来保护客户端的内容,等等。有几篇文章详细描述了客户端代码。所以这个“片段”应该足够了。

服务器端代码是:

@POST
@Path("/login")
@Consumes(MediaType.APPLICATION_JSON)
public Response login(Credentials credentials, @Context HttpServletRequest request) {
    if (isAlreadyAuthenticated(request)) {
        try {
            request.logout();
        } catch (ServletException ex) {
            return Response.status(Status.CONFLICT).build();
        }
    }

    // not authenticated
    try {
        request.login(credentials.getEmail(), credentials.getPassword());
        return Response.ok().build();
    } catch (ServletException ex) {
        return Response.status(Status.CONFLICT).build();
    }
}

但是,这并不能“验证”客户端的进一步请求。当我在成功登录后对受限区域进行 API 调用时,我得到一个403 FORBIDDEN来自服务器端的响应。所以我认为我做错了什么。您对如何向服务器验证客户端以获取进一步请求有什么想法吗?

一个可能的解决方案是切换到基于 FORM 的身份验证,并简单地使用 j_username 和 j_password 调用 j_security_check,但现在我想坚持使用 BASIC-Authentication 并通过 RESTful API 手动执行身份验证。

那个设定$httpProvider.defaults.withCredentials = true;不知何故似乎没有任何效果。

Update:

感谢lossleader的提示我解决了这个问题。 我删除了login()方法,因为我希望 Java EE 服务器负责身份验证。

要访问安全区域,AngularJS Web 应用程序必须正确设置 HTTP 标头。就我而言$http.defaults.headers.common['Authorization'] = 'Basic <username:pw>'; where username:password必须是 Base64 编码。

正确设置标头后,不会显示密码提示,AngularJS Web 应用程序可以访问 REST API。


感谢lossleader的提示我解决了这个问题。我删除了 login() 方法,因为我希望 Java EE 服务器负责身份验证。

要访问安全区域,AngularJS Web 应用程序必须正确设置 HTTP 标头。就我而言 $http.defaults.headers.common['Authorization'] = 'Basic ';其中用户名:密码必须采用 Base64 编码。

正确设置标头后,不会显示密码提示,AngularJS Web 应用程序可以访问 REST API。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何正确验证 AngularJS 客户端到服务器的身份 的相关文章

随机推荐

  • 保留 string_agg 内部的不同顺序

    Mysql函数 with recursive locpais as select l id l nome l tipo tid lp pai from loc l left join locpai lp on lp loc l id whe
  • 根据类别对表列的所有值求和

    我正在尝试根据特定类检索 td 中所有值的总和 该代码不会抛出任何错误 但我的总和始终为 0 数值是否必须以特定方式指定 我在这里看到了一些其他答案 从哪里模仿了代码 我没有看到我的和他们的有任何真正的区别 所以我很困惑为什么我的不起作用
  • 如何等待ShellExecute运行?

    我设法在 VC 中使用 ShellExecute 来启动文档 现在我希望运行一个接收一些参数的命令行工具 并在后台运行 隐藏 而不是最小化 并让它阻止我的程序流程 以便我能够等待它完成 如何更改命令行 ShellExecute NULL o
  • 如何设置xAxis标签之间的间距

    我遇到了图表显示的问题 你可以从图片中看到它 旧版本的图表有apispaceBetweenLabels设置标签之间的间距 我只找到apispaceMax and spaceMin在最新版本中 我尝试使用它们来设置标签之间的空间 但失败了 我
  • NLTK Python 中的词义消歧

    我是 NLTK Python 的新手 我正在寻找一些可以进行词义消歧的示例应用程序 我在搜索结果中有很多算法 但没有示例应用程序 我只是想传递一句话 并想通过参考wordnet库来了解每个单词的含义 谢谢 我在 PERL 中找到了类似的模块
  • 为 Node / MongoDB 应用程序播种的最佳方法是什么?

    所以 我是 MEAN 堆栈的新手 在尝试为 MongoDB 播种时遇到了困难 我正在使用 Mongoose 与数据库进行通信 并且有大量文档表明我应该能够使用填充的 JSON 文件进行播种 我尝试过的 节点 mongo 种子 https w
  • 不使用 oledb 将 Excel 工作表数据导入到 datagrid

    在我的基于 Windows 的应用程序中 C 我想导入 Excel 工作表以在 DatatGridView 中显示其数据 我不想使用 oledb any Help using Excel Microsoft Office Interop E
  • 为什么 gets() 被弃用? [复制]

    这个问题在这里已经有答案了 使用时gets 在我的代码中 编译器大喊 warning the gets function is dangerous and should not be used and warning gets is dep
  • 如何使用 php 和 shell 脚本捕获和提供 telnet?

    这就是我想使用 php 完成的任务 可能使用 excel 使用名为 proxychains 的程序远程登录到 whois 注册商 proxychains telent whois someregistrar 43 如果失败 gt 重试 1
  • xPath:获取父级和第二个兄弟级

    我有一个巨大的 XML 我需要在其中找到支付金额 它距离单元格 2 个单元格CellText amount
  • Google 为现有自动完成参考提供了 API 调用返回 NOT_FOUND 的详细信息

    我有一个问题也许有人也有同样的问题 我正在调用 google place autocomplete api 调用 然后我向用户展示结果 他可以选择地点 根据选择 我正在拨打地点详细信息并检索该地点的详细信息 我的问题是 某些情况下详细信息服
  • 对UITableView使用didSelectRowAtIndexPath或prepareForSegue方法?

    我正在使用情节提要 并且有一个 UITableView 我有一个从我的表推送到详细 VC 的 segue 设置 但我应该使用哪种方法来处理这个问题呢 我必须将几个对象传递到详细视图 但我用吗didSelectRowAtIndex or vo
  • 如何检查使用堆栈安装的软件包版本?

    在我的项目的 cabal 文件中 我有以下内容executable部分 executable ArchPkgstatsScraper hs source dirs app main is Main hs ghc options thread
  • Selenium 启动的 ChromeDriver 在后台保持运行

    I am not able to completely delete a project because the chromedriver instance is running in the background even when th
  • UWP Composition Api 是否支持颜色替换?

    我一直在尝试寻找与颜色替换相关的示例 这是一个使用 Photoshop 的示例 例如 它可以采用蓝色阴影并将其替换为红色阴影 BEFORE AFTER 使用最新版本的 Composition Api 中的 Composition Effec
  • 关于在线HTML5视频系统离线模式的解决方案

    我们有在线网站系统 具有很多功能 例如播放视频等 目的是我们想要为iPad制作具有UIWebView支持的离线模式应用程序 两种选择 使用HTML5清单实现离线模式 here http blog cubeanywhere com 2010
  • JAVA中类的引用大小

    Java中类的引用大小是多少 对于特定的 JVM 和操作系统 它是否恒定 与引用的类无关 Class A Class B Class C A a B b C c 尺寸是a b and c无论大小都相同A B and C课程 是的 所有引用都
  • 使用 ADODB 记录集在 Excel VBA 中查询非常慢的查询以获得先前值

    我在 Access 中有这个查询 它的工作速度非常快并且具有出色的性能 但是 当我想使用 ADODB REORDSET 在 Excel 中使用此查询时 通过复制记录集信息大约需要 15 分钟Range CopyFromRecordset S
  • 使用 NewSequentialID 有什么缺点吗?

    正如问题所述 使用 NewSequentialID 作为表的默认值与 NewID 相比有何缺点 明显的优点是它不会使我们的索引碎片太多 是否担心序列会被最大化 我不认为字段上的默认值真的会成为一个缺点 如果您想在插入某些记录之前控制它们的
  • 如何正确验证 AngularJS 客户端到服务器的身份

    我正在构建一个使用 RESTful API Jersey 的 AngularJS Web 应用程序 在服务器端 我使用 Java 应用程序服务器 具体为 Glassfish 4 我的设置如下 AngularJS webapp 作为单个 wa