小编Aug*_*mer的帖子

如何在 Spring Security 中创建自定义身份验证过滤器?

我正在尝试创建一个自定义 Spring Security 身份验证过滤器以实现自定义身份验证方案。我花了几个小时阅读 Spring Security,但我找到的所有指南都解释了如何配置基本设置;我正在尝试编写自定义设置,但无法找到有关如何执行此操作的文档。

举例来说,假设我的自定义身份验证方案如下:如果客户端在 http 请求中提供“foo_username”标头和“foo_password”标头(为了示例,两者均未加密),那么我的自定义过滤器需要构造一个 UsernamePasswordAuthenticationToken。当然,如果密码错误,那就是认证错误。如果任一标头丢失,则表示身份验证错误。如果两个标头都丢失,我想在不更改任何内容的情况下委托过滤器链。

理论上这看起来很简单,但我不知道如何在 Spring 中实现。我打算自己根据数据库检查密码吗?或者这是 UserDetailsPasswordService 的责任?我是否打算自己修改 SecurityContextHolder.getContext().authentication 字段?我应该将哪些职责委托给 AuthenticationManager?当各种方式认证失败时,会抛出哪些异常?我是否实现 Filter、OncePerRequestFilter 或 AbstractAuthenticationFilter?有没有关于如何执行这一切的文档???

诚然,这是如何使用 Spring security 创建自己的安全过滤器的重复?,但我不是他,他没有得到答案。

谢谢您的帮助!

java spring-security spring-boot spring-filter

7
推荐指数
1
解决办法
4万
查看次数

如何在 Strapi 中安全地设置数据库密码?

Strapi 框架(据我了解)要求在启动时提供数据库密码。通常,密码在database.js文件中指定,如下所示:

module.exports = ({ env }) => ({
  defaultConnection: 'default',
  connections: {
    default: {
      connector: 'bookshelf',
      settings: {
        client: 'postgres',
        host: '/cloudsql/myDatabaseInstanceName',
        database: 'databaseName',
        username: 'databaseUsername',
        password: 'databasePassword',
      },
    },
  },
});
Run Code Online (Sandbox Code Playgroud)

这当然不是很安全,因为database.js文件通常会提交到存储库。

因此,有些人将密码注入到database.js文件中,而不是将其存储为环境变量:

module.exports = ({ env }) => ({
  defaultConnection: 'default',
  connections: {
    default: {
      connector: 'bookshelf',
      settings: {
        client: 'postgres',
        host: `/cloudsql/${env('INSTANCE_CONNECTION_NAME')}`,
        database: env('DATABASE_NAME'),
        username: env('DATABASE_USERNAME'),
        password: env('DATABASE_PASSWORD'),
      },
    },
  },
});
Run Code Online (Sandbox Code Playgroud)

然而,这也不是很安全。在许多运行时环境(包括我正在使用的 Google App Engine)中,任何项目用户都可以以明文形式查看环境密码。

理想情况下,我想将数据库密码存储在秘密保险库中(我正在使用 Google Secret Manager),并以某种方式 …

security google-app-engine node.js strapi

6
推荐指数
1
解决办法
2344
查看次数

Git 挂钩在合并到 master 时增加版本号

目标是在分支合并到package.json时自动增加版本号,但不是功能分支合并到的版本号,也不是分支合并到的版本号。(我稍微简化了我的用例,但基本上就是这样。)developmasterdevelopreleasemaster

实际上增加版本号很容易 - 已经有一个 npm 命令可以做到这一点。

但我不明白如何编写 Git 挂钩来运行该命令。如何确定当前分支的名称以及要合并到的分支?这可以在预合并提交挂钩中完成吗?是否甚至可以编辑源代码并预合并提交挂钩进行提交?

git githooks npm

6
推荐指数
1
解决办法
2925
查看次数

Angular 9 - onSameUrlNavigation='reload' 不触发路由器事件

我的 Angular 9 应用程序有一个 CustomErrorHandler 和一个 ErrorPageComponent。当整个应用程序抛出任何异常时,CustomErrorHandler 将告诉路由器导航到 ErrorPageComponent。但是,ErrorPageComponent 内部有一个按钮可能会抛出自己的异常,在这种情况下,我希望 CustomErrorHandler 仍然告诉路由器导航到 ErrorPageComponent,就像正常情况一样。然而,当ErrorPageComponent以这种方式路由到自身时,它需要再次调用其初始化方法。

通常,如果您希望组件在路由到自身后调用初始化方法,只需订阅路由事件即可。然后,只要你正确设置了 onSameUrlNavigation 来重新加载,当组件导航到自身时,路由器就会触发一个路由事件,并调用你的组件订阅它的回调方法。

但是,当我的 CustomErrorHandler 告诉路由器导航到 ErrorPageComponent 时,不会触发任何路由事件。

如果您查看代码,这会更有意义:

这是我在 app-routing.module.ts 中的路由配置:

const routes: Routes = [
  { path: 'normal', component: NormalComponent},
  { path: '',   redirectTo: '/normal', pathMatch: 'full'}
];

const volitileRoutes: Routes = [
  { path: 'error', component: ErrorPageComponent}
];

const fallbackRoute: Routes = [
  { path: '**', component: Error404PageComponent }
];

@NgModule({
  imports: [
    RouterModule.forRoot(routes),
    RouterModule.forRoot(volitileRoutes, {onSameUrlNavigation: 'reload'}), // I've correctly set onSameUrlNavigation …
Run Code Online (Sandbox Code Playgroud)

angular-routing angular angular9

5
推荐指数
1
解决办法
1万
查看次数

SassError:找不到要导入的样式表。@use '~@angular/material' 作为垫子;

我使用 CLI 创建了一个 Angular 项目。我正在使用 SCSS,并且我在自定义主题 iirc 中包含了 Angular Material。我添加了几个虚拟组件,该应用程序仍然构建得很好。然后我需要使用 Angular Material 来设计我的组件。为此,我添加@use '~@angular/material' as mat;style.scss文件的第一行。一旦我这样做了,应用程序将不再构建。它总是抛出以下错误:

ERROR in ./src/styles.scss (./node_modules/css-loader/dist/cjs.js??ref--13-1!./node_modules/postcss-loader/src??embedded!./node_modules/resolve-url-loader??ref--13-3!./node_modules/sass-loader/dist/cjs.js??ref--13-4!./src/styles.scss)
Module build failed (from ./node_modules/sass-loader/dist/cjs.js):
SassError: Can't find stylesheet to import.
  ?
1 ? @use '~@angular/material' as mat;
  ? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  ?
  src/styles.scss 1:1  root stylesheet

Run Code Online (Sandbox Code Playgroud)

我不知道我做错了什么;我的印象是,以这种方式导入 Angular Material 会奏效。难道我做错了什么?

style.scss如果有帮助,这是我的整个文件:

@use '~@angular/material' as mat;

// Custom Theming for Angular Material
// For more information: https://material.angular.io/guide/theming
@import '~@angular/material/theming';
// Plus imports for other components in your …
Run Code Online (Sandbox Code Playgroud)

sass angular-material angular-material2 angular

4
推荐指数
6
解决办法
4552
查看次数

h:dataTable始终显示一行;将不显示零行

我正在使用旧版JSF Web应用程序,而我的h:dataTable元素给我带来了麻烦。通常,它显示的正是我想要的方式-标头和几行,所有行都带有适当的填充和边距。

h:数据表正确显示三行

但是,如果我尝试显示具有零行的表(这对我来说是一个有效的用例),那么JSF仍将呈现一行,尽管没有内容。

h:dataTable应该渲染零行时渲染一空行

这是此h:dataTable的源代码:

<h:dataTable styleClass="table" value="#{backingBean.emptyList}" var="result">

    <h:column>
        <f:facet name="header">First Column</f:facet>
        <h:outputText value="#{result}"/>
    </h:column>

    <h:column>
        <f:facet name="header">Second Column</f:facet>
        <h:outputText value="#{result}"/>
    </h:column>

    <h:column>
        <f:facet name="header">Third Column</f:facet>
        <h:outputText value="#{result}"/>
    </h:column>

</h:dataTable>

Run Code Online (Sandbox Code Playgroud)

这是浏览器呈现的内容:

<table class="table">
    <thead>
        <tr>
            <th scope="col">First Column</th>
            <th scope="col">Second Column</th>
            <th scope="col">Third Column</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td></td>
            <td></td>
            <td></td>
        </tr>
    </tbody>
</table>
Run Code Online (Sandbox Code Playgroud)

以下是支持bean的方法,这些方法可以为我提供结果列表:

public List<String> getEmptyList() { // incorrectly renders 1 empty row
    return Collections.emptyList();
}

public List<String> getThreeRows() { // correctly renders 3 rows
    return Arrays.asList(new String[] …
Run Code Online (Sandbox Code Playgroud)

css jsf jsf-2

2
推荐指数
1
解决办法
106
查看次数

Observable 的 Observable 数组 - 如何在 RxJS 中实现?

我只是第一次学习 RxJS,所以如果这个问题是基于错误的假设,我深表歉意。

例如,假设我的 Angular 应用程序中有一个 FooService,它返回一个Array<Foo>. 可以从列表中任意添加和删除元素。因此,我将我的 Foos 数组包装在一个 RxJS observable 中;FooService 现在返回一个BehavioralSubject<Array<Foo>>. 现在我可以使用 Angular 的 AsyncPipe 在每次 BehavioralSubject 更新时自动重新渲染必要的组件。到目前为止,这是微不足道的 RxJS 101。

但是在我的应用中,不仅 Foo 数组可以接收更新,而且每个单独的 Foo 都可以在不影响数组的情况下接收更新。我如何设计这个?我是否将每个单独的 Foo 包装在一个 Observable 中,使我的 FooService 返回一个BehavioralSubject<Array<BehavioralSubject<Foo>>>?这看起来很乱。BehavioralSubject<Array<Foo>>每次 Foo 更新时,我是否继续返回 a并重新渲染整个 Array 组件?这将 Foo 更新与 Array 更新紧密绑定,防止我在应用程序的其他部分重用我的 Foo 组件。

在 RxJS 中执行此操作的最佳方法是什么?我如何(实际上)实现一个(概念上的) Observable 的 Observable 数组?

observable rxjs reactivex angular

1
推荐指数
1
解决办法
243
查看次数