我正在尝试创建一个自定义 Spring Security 身份验证过滤器以实现自定义身份验证方案。我花了几个小时阅读 Spring Security,但我找到的所有指南都解释了如何配置基本设置;我正在尝试编写自定义设置,但无法找到有关如何执行此操作的文档。
举例来说,假设我的自定义身份验证方案如下:如果客户端在 http 请求中提供“foo_username”标头和“foo_password”标头(为了示例,两者均未加密),那么我的自定义过滤器需要构造一个 UsernamePasswordAuthenticationToken。当然,如果密码错误,那就是认证错误。如果任一标头丢失,则表示身份验证错误。如果两个标头都丢失,我想在不更改任何内容的情况下委托过滤器链。
理论上这看起来很简单,但我不知道如何在 Spring 中实现。我打算自己根据数据库检查密码吗?或者这是 UserDetailsPasswordService 的责任?我是否打算自己修改 SecurityContextHolder.getContext().authentication 字段?我应该将哪些职责委托给 AuthenticationManager?当各种方式认证失败时,会抛出哪些异常?我是否实现 Filter、OncePerRequestFilter 或 AbstractAuthenticationFilter?有没有关于如何执行这一切的文档???
诚然,这是如何使用 Spring security 创建自己的安全过滤器的重复?,但我不是他,他没有得到答案。
谢谢您的帮助!
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),并以某种方式 …
目标是在分支合并到package.json时自动增加版本号,但不是功能分支合并到的版本号,也不是分支合并到的版本号。(我稍微简化了我的用例,但基本上就是这样。)developmasterdevelopreleasemaster
实际上增加版本号很容易 - 已经有一个 npm 命令可以做到这一点。
但我不明白如何编写 Git 挂钩来运行该命令。如何确定当前分支的名称以及要合并到的分支?这可以在预合并提交挂钩中完成吗?是否甚至可以编辑源代码并从预合并提交挂钩进行提交?
我的 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) 我使用 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) 我正在使用旧版JSF Web应用程序,而我的h:dataTable元素给我带来了麻烦。通常,它显示的正是我想要的方式-标头和几行,所有行都带有适当的填充和边距。

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

这是此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) 我只是第一次学习 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 数组?