二、AuthenticationManager两种使用方式

1、默认方式

只要引入security依赖,SpringBoot默认会在工厂中创建AuthenticationManager bean,直接使用即可,但是使用是通过AuthenticationManagerBuilder来使用,如下

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
     * 自定义一个方法,把springboot工厂中默认配置的AuthenticationManager拿出来使用即可
    @Autowired
    public void authManager(AuthenticationManagerBuilder builder){
        System.out.println("默认=="+builder);
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .anyRequest().authenticated()
                .and().formLogin();

对于默认方式,默认工厂中有userDetailsService之后,AuthenticationManager自动会配置userDetailsService,所以使用的时候无需再自定义

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Bean
    public UserDetailsService userDetailsService(){
        InMemoryUserDetailsManager userDetailsManager = new InMemoryUserDetailsManager();
        userDetailsManager.createUser(User.withUsername("root").password("root").roles("admin").build());
        return userDetailsManager;
    /*工厂中的AuthenticationManager会自动配置上面的userDetailsService 所以无需自定义
    @Autowired
    public void authManager(AuthenticationManagerBuilder builder) throws Exception {
        builder.userDetailsService(userDetailsService());
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .anyRequest().authenticated()
                .and().formLogin();

2、自定义方式

重写配置中的configure(AuthenticationManagerBuilder builder)方法,就会覆盖工厂默认的AuthenticationManager bean

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Bean
    public UserDetailsService userDetailsService(){
        InMemoryUserDetailsManager userDetailsManager = new InMemoryUserDetailsManager();
        userDetailsManager.createUser(User.withUsername("root").password("root").roles("admin").build());
        return userDetailsManager;
    //自定义
    @Override
    protected void configure(AuthenticationManagerBuilder builder) throws Exception {
        //自定义AuthenticationManager后需要手动配置上面的userDetailsService
        builder.userDetailsService(userDetailsService());//改的是DaoAuthenticationProvider
        //也可通过builder.authenticationProvider()自定authenticationProvider
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .anyRequest().authenticated()
                .and().formLogin();

默认的AuthenticationManager,在任何地方都可以注入使用,但是这种自定义方式创建的AuthenticationManager是对象工厂内部本地的一个AuthenticationManager,在其他地方使用,比如我们的controller中注入的时候就会出错,需要我们将自定义的AuthenticationManager暴露出去

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Bean
    public UserDetailsService userDetailsService(){
        InMemoryUserDetailsManager userDetailsManager = new InMemoryUserDetailsManager();
        userDetailsManager.createUser(User.withUsername("root").password("root").roles("admin").build());
        return userDetailsManager;
    //自定义
    @Override
    protected void configure(AuthenticationManagerBuilder builder) throws Exception {
        //手动配置上面的userDetailsService
        builder.userDetailsService(userDetailsService());//改的是DaoAuthenticationProvider
        //也可通过builder.authenticationProvider()自定authenticationProvider
    //将上面自定义的AuthenticationManager在工厂中暴露,可以在任何位置注入
    @Override
    @Bean
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .anyRequest().authenticated()
                .and().formLogin();

二、全局AuthenticationManager使用自定义数据源

1、数据库表设计

2、逻辑实现

boot整合mybatis流程省略

实体类如下(省略get set)

public class Role { private Integer id; private String name; private String nameZh; * 自定义用户类实现UserDetails * 定义所有set方法 * get方法只需要id和roles就行 public class User implements UserDetails { private Integer id; private String username; private String password; private Boolean enabled; private Boolean accountNonLocked;//账号是否被锁 private Boolean accountNonExpired;//账号是否过期 private Boolean credentialsNonExpired;//密码是否过期 private List<Role> roles = new ArrayList<>();//当前用户所有角色 //权限信息 @Override public Collection<? extends GrantedAuthority> getAuthorities() { Set<SimpleGrantedAuthority> authorities = new HashSet<>(); //数据库角色转成权限信息 roles.forEach(role -> { SimpleGrantedAuthority simpleGrantedAuthority = new SimpleGrantedAuthority(role.getName()); authorities.add(simpleGrantedAuthority); return authorities; @Override public String getPassword() { return password; @Override public String getUsername() { return username; @Override public boolean isAccountNonExpired() { return accountNonExpired; @Override public boolean isAccountNonLocked() { return accountNonLocked; @Override public boolean isCredentialsNonExpired() { return credentialsNonExpired; @Override public boolean isEnabled() { return enabled; public Integer getId() { return id; public List<Role> getRoles() { return roles; public void setId(Integer id) { this.id = id; public void setUsername(String username) { this.username = username; public void setPassword(String password) { this.password = password; public void setEnabled(Boolean enabled) { this.enabled = enabled; public void setAccountNonLocked(Boolean accountNonLocked) { this.accountNonLocked = accountNonLocked; public void setAccountNonExpired(Boolean accountNonExpired) { this.accountNonExpired = accountNonExpired; public void setCredentialsNonExpired(Boolean credentialsNonExpired) { this.credentialsNonExpired = credentialsNonExpired; public void setRoles(List<Role> roles) { this.roles = roles;

自定义数据源类

@Component
public class MyUserDetailsService implements UserDetailsService {
    @Autowired
    UserDao userDao;
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        //根据用户名查询
        User user = userDao.loadUserByUsername(username);
        if(ObjectUtils.isEmpty(user)){
            throw new UsernameNotFoundException("用户名不正确");
        //根据用户查询具有的角色
        List<Role> roles = userDao.getRolesByUid(user.getId());
        //设置权限 后续直接可通过getAuthorities获取到权限信息
        user.setRoles(roles);
        return user;

 mapper.xml两个方法

@Configuration
public class MySecurityConfig extends WebSecurityConfigurerAdapter {
    //注入自定义的数据源
    @Autowired
    private MyUserDetailsService myUserDetailsService;
    //自定义AuthenticationManager
    @Override
    protected void configure(AuthenticationManagerBuilder builder) throws Exception {
        builder.userDetailsService(myUserDetailsService);
    //暴露自定义的AuthenticationManager
    @Override
    @Bean
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                //=================资源拦截=============
                .mvcMatchers("/user/login").permitAll()//permitAll()表示放行资源 无需认证就可访问 必须放在所有认证前
                .anyRequest().authenticated()//anyRequest()所有请求 .authenticated()表示所有请求需要认证才能访问
                .and().formLogin() //formLogin()表示表单认证
                //=================登录界面配置=================
                .loginPage("/login.html")//自定义访问登录页面地址
                .loginProcessingUrl("/doLogin")//自定义登录请求的url
                .usernameParameter("name")//自定义用户名、密码变量名
                .passwordParameter("pass")
                //=================认证配置=================
                .successForwardUrl("/index")//认证成功始终跳转的路径.defaultSuccessUrl("/hello") redirect 重定向跳转 但是优先跳转到请求的路径 ,可以传入第二个参数true总是重定向到hello
                .failureForwardUrl("/user/toLoginPage")//认证失败 跳转 错误信息在request中,.failureUrl("/login.html")认证失败 redirect跳转 错误信息在session中
                //=================注销相关配置==========================
                .and().logout()//开启注销,默认是配置的
                .logoutUrl("/user/logout")//注销地址,默认是logout 并且请求方式只能是get
                .invalidateHttpSession(true)//清除session信息,默认true
                .clearAuthentication(true)//清除认证信息,默认true
                .logoutSuccessUrl("/user/toLoginPage")//退出,默认是登录页面地址
                .and().csrf().disable();
@Configuration
public class WebSecurityConfigurer extends WebSecurityConfigurerAdapter {
  @Autowired
  public void initialize(AuthenticationManagerBuilder builder) {
    //buil
核心 -  spring-security-core.jar 25
远程处理 - spring-security-remoting.jar 25
Web - spring-security-web.jar 25
配置 - spring-security-config.jar 26
LDAP - spring-security-ldap.jar 26
ACL - spring-security-acl.jar 26
CAS - spring-security-cas.jar 26
OpenID - spring-security-openid.jar 26
测试 - spring-security-test.jar 26
2.4.4检出来源 26
3. Spring Security 4.2的新特性 27
3.1 Web改进 27
3.2配置改进 28
3.3杂项 28
4.样品和指南(从这里开始) 28
5. Java配置 29
5.1 Hello Web安全Java配置 29
5.1.1 AbstractSecurityWebApplicationInitializer 31
5.1.2 AbstractSecurityWebApplicationInitializer不存在Spring 31
5.1.3使用Spring MVC的AbstractSecurityWebApplicationInitializer 32
5.2 HttpSecurity 32
5.3 Java配置和表单登录 34
5.4授权请求 35
5.5处理注销 36
5.5.1 LogoutHandler 37
5.5.2 LogoutSuccessHandler 37
5.5.3更多注销相关参考 38
5.6认证 38
5.6.1内存认证 38
5.6.2 JDBC认证 39
5.6.3 LDAP认证 39
5.6.4 AuthenticationProvider 41
5.6.5 UserDetailsService 41
5.6.6 LDAP认证 41
5.7多个HttpSecurity 41
5.8方法安全性 43
5.8.1 EnableGlobalMethodSecurity 43
5.8.2 GlobalMethodSecurityConfiguration 44
5.9后处理配置的对象 45
5.10自定义DSL 46
6.安全命名空间配置 47
6.1简介 47
6.1.1命名空间的设计 49
6.2安全命名空间配置入门 50
6.2.1 web.xml配置 50
6.2.2最小的配置 50
6.2.3表单和基本登录选项 52
设置默认的登录目的地 54
6.2.4注销处理 54
6.2.5使用其他身份验证提供程序 55
添加密码编码器 56
6.3高级Web功能 56
6.3.1记得我认证 56
6.3.2添加HTTP / HTTPS通道安全 57
6.3.3会话管理 57
检测超时 57
并发会话控制 58
会话固定攻击保护 59
6.3.4 OpenID支持 60
属性交换 61
6.3.5响应头 62
6.3.6添加你自己的过滤器 62
设置一个自定义AuthenticationEntryPoint 64
6.4方法安全 64
6.4.1 元素 65
使用protect-pointcut添加安全性切入点 66
6.5默认AccessDecisionManager 67
6.5.1自定义AccessDecisionManager 67
6.6验证管理器和命名空间 67
7.示例应用程序 69
7.1教程示例 69
7.2联系人 69
7.3 LDAP样本 71
7.4 OpenID示例 71
7.5 CAS样品 71
7.6 JAAS样品 72
7.7预认证样本 72
8. Spring Security社区 72
8.1问题跟踪 72
8.2成为参与 73
8.3更多信息 73
第二部分 架构与实现 73
9.技术概述 73
9.1运行环境 73
9.2核心组件 74
9.2.1 SecurityContextHolder,SecurityContext和认证对象 74
获取有关当前用户的信息 75
9.2.2 UserDetailsService 75
9.2.3授予权力 77
9.2.4总结 77
9.3认证 78
9.3.1什么是Spring Security中的认证? 78
9.3.2直接设置SecurityContextHolder内容 80
9.4 Web应用程序中的身份验证 81
9.4.1 ExceptionTranslationFilter 82
9.4.2 AuthenticationEntryPoint 82
9.4.3认证机制 82
9.4.4在请求之间存储SecurityContext 83
9.5 Spring Security中的访问控制(授权) 84
9.5.1安全和AOP建议 84
9.5.2安全对象和AbstractSecurityInterceptor 85
什么是配置属性? 85
RunAsManager 86
AfterInvocationManager 86
扩展安全对象模型 87
9.6本地化 87
10.核心服务 89
10.1 AuthenticationManager,ProviderManagerAuthenticationProvider 89
10.1.1成功认证时清除证书 91
10.1.2 DaoAuthenticationProvider 91
10.2 UserDetailsService实现 92
10.2.1内存认证 92
10.2.2 JdbcDaoImpl 93
权威组织 94
10.3密码编码 94
10.3.1什么是散列? 95
10.3.2添加盐到哈希 95
10.3.3散列和认证 96
10.4Jackson 支持 96
第三部分 测试 97
11.测试方法安全性 97
11.1安全测试设置 98
11.2 @WithMockUser 98
11.3 @WithAnonymousUser 100
11.4 @用户详细信息 101
11.5 @WithSecurityContext 102
11.6测试元注释 104
12. Spring MVC测试集成 104
12.1设置MockMvc和Spring Security 104
12.2 SecurityMockMvcRequestPostProcessors 105
12.2.1使用CSRF保护进行测试 105
12.2.2在Spring MVC测试中以用户身份运行测试 106
12.2.3使用RequestPostProcessor在Spring MVC测试中以用户身份运行 106
作为用户在Spring MVC测试中使用注释运行 108
12.2.4测试HTTP基本认证 109
12.3 SecurityMockMvcRequestBuilders 109
12.3.1测试基于表单的认证 109
12.3.2测试注销 110
12.4 SecurityMockMvcResultMatchers 110
12.4.1未经认证的声明 111
12.4.2认证断言 111
第四部分 Web应用程序安全 112
13.安全过滤器链 112
13.1 DelegatingFilterProxy 112
13.2 FilterChainProxy 113
13.2.1绕过滤网链 115
13.3过滤器排序 115
13.4请求匹配和HttpFirewall 116
13.5与其他基于过滤器的框架一起使用 118
13.6高级命名空间配置 118
14.核心安全筛选器 119
14.1 FilterSecurityInterceptor 119
14.2 ExceptionTranslationFilter 121
14.2.1 AuthenticationEntryPoint 122
14.2.2 AccessDeniedHandler 122
14.2.3 SavedRequest和RequestCache接口 123
14.3 SecurityContextPersistenceFilter 123
14.3.1 SecurityContextRepository 124
14.4 UsernamePasswordAuthenticationFilter 125
14.4.1认证成功与失败的应用流程 125
15. Servlet API集成 127
15.1 Servlet 2.5+集成 127
15.1.1 HttpServletRequest.getRemoteUser() 127
15.1.2 HttpServletRequest.getUserPrincipal() 127
15.1.3 HttpServletRequest.isUserInRole(String) 128
15.2 Servlet 3+集成 128
15.2.1 HttpServletRequest.authenticate(HttpServletResponse) 128
15.2.2 HttpServletRequest.login(String,String) 129
15.2.3 HttpServletRequest.logout() 129
15.2.4 AsyncContext.start(Runnable) 129
15.2.5异步Servlet支持 130
15.3 Servlet 3.1+集成 131
15.3.1 HttpServletRequest#changeSessionId() 132
16.基本和摘要式身份验证 132
16.1 BasicAuthenticationFilter 132
16.1.1配置 132
16.2 DigestAuthenticationFilter 133
16.2.1配置 135
17.记住我的身份验证 136
17.1概述 136
17.2简单的基于哈希的令牌方法 136
17.3持久性令牌方法 137
17.4记住我的接口和实现 138
17.4.1 TokenBasedRememberMeServices 138
17.4.2 PersistentTokenBasedRememberMeServices 139
18.跨站点请求伪造(CSRF) 140
18.1 CSRF攻击 140
18.2同步器令牌模式 141
18.3何时使用CSRF保护 142
18.3.1 CSRF保护和JSON 142
18.3.2 CSRF和无状态浏览器应用程序 143
18.4使用Spring Security CSRF保护 143
18.4.1使用适当的HTTP动词 144
18.4.2配置CSRF保护 144
18.4.3包含CSRF令牌 145
表单提交 145
Ajax和JSON请求 145
CookieCsrfTokenRepository 146
18.5 CSRF警告 147
18.5.1超时 148
18.5.2登录 148
18.5.3注销 149
18.5.4多部分(文件上传) 149
在Spring Security之前放置MultipartFilter 150
包含CSRF令牌 151
18.5.5隐藏的HttpMethodFilter 151
18.6覆盖默认值 151
19. CORS 152
20.安全性HTTP响应头 154
20.1默认的安全头 154
20.1.1缓存控制 157
20.1.2内容类型选项 158
20.1.3 HTTP严格传输安全(HSTS) 159
20.1.4 HTTP公钥密码(HPKP) 161
20.1.5 X-Frame-Options 163
20.1.6 X-XSS保护 164
20.1.7内容安全策略(CSP) 165
配置内容安全策略 166
其他资源 168
20.1.8推荐人政策 168
配置引用者策略 169
20.2自定义标题 169
20.2.1静态头 169
20.2.2标题作者 170
20.2.3 DelegatingRequestMatcherHeaderWriter 171
21.会议管理 172
21.1 SessionManagementFilter 173
21.2 SessionAuthenticationStrategy 173
21.3并发控制 174
21.3.1查询当前通过身份验证的用户及其会话的SessionRegistry 176
22.匿名身份验证 177
22.1概述 177
22.2配置 178
22.3 AuthenticationTrustResolver 179
23. WebSocket安全 180
23.1 WebSocket配置 181
23.2 WebSocket身份验证 182
23.3 WebSocket授权 182
23.3.1 WebSocket授权说明 183
消息类型的WebSocket授权 184
目的地上的WebSocket授权 184
23.3.2出站消息 185
23.4执行相同的来源政策 185
23.4.1为什么同源? 185
23.4.2 Spring WebSocket允许的来源 186
23.4.3添加CSRF到Stomp头 186
23.4.4在WebSockets中禁用CSRF 187
23.5使用SockJS 187
23.5.1 SockJS和框架选项 187
23.5.2轻松放松CSRF 188
第五部分授权 190
24.授权体系结构 190
24.1当局 190
24.2预调用处理 191
24.2.1 AccessDecisionManager 191
24.2.2基于投票的AccessDecisionManager实现 192
RoleVoter 193
AuthenticatedVoter 194
自定义选民 194
24.3调用处理后 194
24.4分层角色 196
25.安全的对象实现 197
25.1 AOP联盟(MethodInvocation)安全拦截器 197
25.1.1显式MethodSecurityInterceptor配置 197
25.2 AspectJ(JoinPoint)安全拦截器 198
26.基于表达式的访问控制 200
26.1概述 200
26.1.1通用内置表达式 201
26.2网络安全表达式 202
26.2.1在Web安全表达式中引用Bean 203
26.2.2 Web安全表达式中的路径变量 204
26.3方法安全表达式 204
26.3.1 @Pre和@Post注释 205
访问控制使用@PreAuthorize和@PostAuthorize 205
使用@PreFilter和@PostFilter进行过滤 207
26.3.2内置表达式 207
PermissionEvaluator接口 208
方法安全元注释 209
第六部分 其他主题 209
27.域对象安全(ACL) 209
27.1概述 209
27.2重要概念 211
27.3入门 214
28.预认证方案 216
28.1预认证框架类 216
28.1.1 AbstractPreAuthenticatedProcessingFilter 217
J2eeBasedPreAuthenticatedWebAuthenticationDetailsSource 217
28.1.2 PreAuthenticatedAuthenticationProvider 218
28.1.3 Http403ForbiddenEntryPoint 218
28.2具体实施 219
28.2.1请求头认证(Siteminder) 219
Siteminder示例配置 219
28.2.2 Java EE容器认证 220
29. LDAP认证 220
29.1概述 220
29.2在Spring Security中使用LDAP 221
29.3配置LDAP服务器 221
29.3.1使用嵌入式测试服务器 222
29.3.2使用绑定认证 222
29.3.3加载权限 223
29.4实现类 223
29.4.1 LdapAuthenticator实现 224
通用功能 224
认证者 225
PasswordComparisonAuthenticator 225
29.4.2连接到LDAP服务器 225
29.4.3 LDAP搜索对象 225
FilterBasedLdapUserSearch中 225
29.4.4 LdapAuthoritiesPopulator 226
29.4.5 Spring Bean配置 226
29.4.6 LDAP属性和定制的UserDetails 227
29.5 Active Directory认证 228
29.5.1 ActiveDirectoryLdapAuthenticationProvider 228
活动目录错误代码 229
30. JSP标签库 230
30.1声明Taglib 230
30.2授权标签 230
30.2.1禁用测试的标签授权 231
30.3认证标签 232
30.4 accesscontrollist标签 232
30.5 csrfInput标签 233
30.6 csrfMetaTags标签 233
31 Java认证和授权服务(JAAS)提供者 235
31.1概述 235
31.2摘要:Java认证提供者 235
31.2.1 JAAS CallbackHandler 235
31.2.2 JAAS权威机构 236
31.3 DefaultJaasAuthenticationProvider 237
31.3.1 InMemoryConfiguration 237
31.3.2 DefaultJaasAuthenticationProvider示例配置 238
31.4 JaasAuthenticationProvider 239
31.5作为主题运行 240
32. CAS认证 240
32.1概述 240
32.2 CAS的工作原理 240
32.2.1 Spring安全和CAS交互序列 241
32.3 CAS客户端的配置 244
32.3.1服务票据认证 244
32.3.2单一注销 246
32.3.3使用CAS认证无状态服务 249
配置CAS以获取代理授予票证 249
使用代理票证调用无状态服务 250
32.3.4代理票证认证 251
33. X.509认证 253
33.1概述 253
33.2将X.509身份验证添加到您的Web应用程序 253
33.3在Tomcat中设置SSL 254
34.运行认证替换 255
34.1概述 255
34.2配置 255
35. Spring Security加密模块 257
35.1简介 257
35.2加密器 257
35.2.1 BytesEncryptor 257
35.2.2 TextEncryptor 258
35.3关键发电机 258
35.3.1 BytesKeyGenerator 258
35.3.2 StringKeyGenerator 259
35.4密码编码 259
36.并发支持 260
36.1 DelegatingSecurityContextRunnable 260
36.2 DelegatingSecurityContextExecutor 262
36.3 Spring安全性并发类 264
37. Spring MVC集成 265
37.1 @EnableWebMvcSecurity 265
37.2 MvcRequestMatcher 265
37.3 @AuthenticationPrincipal 268
37.4 Spring MVC异步集成 271
37.5 Spring MVC和CSRF集成 271
37.5.1自动令牌包含 271
37.5.2解析CsrfToken 272
第七部分 Spring数据集成 273
38. Spring Data&Spring安全配置 273
39. @Query中的安全表达式 273
第八部分 附录 274
40.安全数据库模式 274
40.1用户模式 274
40.1.1集团当局 274
40.2持久登录(记得我)架构 275
40.3 ACL模式 275
40.3.1 HyperSQL 276
40.3.2 PostgreSQL 277
40.3.3 MySQL和MariaDB 278
40.3.4 Microsoft SQL Server 279
40.3.5 Oracle数据库 280
41.安全命名空间 282
41.1 Web应用程序安全性 282
41.1.1  282
41.1.2  282
属性 283
的子元素 285
41.1.3  286
的父元素 286
属性 286
41.1.4  286
属性 287
父元素 287
41.1.5 <headers> 287
<headers>属性 288
<headers>的父元素 288
<headers>的子元素 288
41.1.6  289
属性 289
的父元素 289
41.1.7  289
属性 289
的父元素 290
41.1.8  290
属性 290
的父元素 290
41.1.9  290
的子元素 290
41.1.10  291
属性 291
的父元素 291
41.1.11  291
属性 291
的父元素 291
41.1.12  291
属性 292
的父元素 292
41.1.13 <frame-options> 292
<frame-options>属性 292
<frame-options>的父元素 293
41.1.14 [removed] 293
[removed]属性 293
[removed]的父元素 294
41.1.15  294
属性 294
的父元素 294
41.1.16 <header> 294
<header-attributes>属性 294
<header>的父元素 295
41.1.17  295
的父元素 295
属性 295
41.1.18  295
父元素 296
属性 296
41.1.19  296
的父元素 296
属性 296
41.1.20 <expression-handler> 297
<expression-handler>的父元素 297
属性 297
41.1.21 <form-login> 297
<form-login>的父元素 298
<form-login>属性 298
41.1.22  299
的父元素 300
属性 300
41.1.23 元素 300
属性 300
41.1.24  300
的父元素 300
属性 301
41.1.25  302
的父元素 302
属性 302
41.1.26  302
父元素 302
属性 303
41.1.27  303
的父元素 303
属性 303
的子元素 305
41.1.28  305
的父元素 305
属性 305
的子元素 305
41.1.29  306
的父元素 306
属性 306
41.1.30  306
的父元素 306
的子元素 307
41.1.31  307
的父元素 307
属性 307
41.1.32  307
的父元素 307
属性 307
41.1.33 元素 309
的父元素 309
属性 309
41.1.34  309
的父元素 309
属性 309
的子元素 310
41.1.35  311
的父元素 311
属性 311
41.1.36  312
的父元素 312
属性 312
41.1.37  313
属性 313
的子元素 313
41.1.38  313
的父元素 313
属性 313
41.1.39  314
属性 314
的子元素 314
41.2 WebSocket安全 314
41.2.1  315
属性 315
的子元素 316
41.2.2  316
的父元素 316
属性 316
41.3认证服务 317
41.3.1  317
属性 317
的子元素 317
41.3.2  318
的父元素 318
属性 318
的子元素 318
41.3.3  319
属性 319
41.3.4  320
的父元素 320
属性 320
的子元素 320
41.3.5  320
的父元素 321
属性 321
41.3.6  321
属性 321
的子元素 321
41.3.7  321
的父元素 322
属性 322
41.4方法安全 322
41.4.1  322
属性 322
的子元素 324
41.4.2  324
的父元素 324
属性 324
41.4.3  324
的父元素 325
41.4.4  325
的父元素 325
属性 325
41.4.5  325
的父元素 325
属性 325
41.4.6  326
的父元素 326
属性 326
41.4.7使用安全方法 326
父节点 326
属性 326
41.4.8  326
属性 327
的子元素 327
41.4.9  327
属性 327
的子元素 327
41.4.10  327
父元素 328
属性 328
41.5 LDAP名称空间选项 328
41.5.1使用。定义LDAP服务器 328
属性 329
41.5.2  329
的父元素 329
属性 329
的子元素 331
41.5.3  331
的父元素 331
属性 332
的子元素 332
41.5.4  332
属性 332
42.春季安全依赖 333
42.1 spring-security-core 334
42.2 spring-security-remoting 334
42.3 spring-security-web 335
42.4 spring-security-ldap 335
42.5 spring-security-config 336
42.6 spring-security-acl 336
42.7 spring-security-cas 337
42.8 spring-security-openid 337
42.9 spring-security-taglibs 338
43.代理服务器配置 338
44. Spring Security FAQ 339
44.1一般问题 339
44.1.1 Spring Security是否会处理我所有的应用程序安全要求? 339
44.1.2为什么不使用web.xml安全? 339
44.1.3需要哪些JavaSpring Framework版本? 341
44.1.4我是Spring Security的新手,我需要构建一个支持通过HTTPS进行CAS单点登录的应用程序,同时允许对某些URL进行本地基本身份验证,并对多个后端用户信息源(LDAP和JDBC)进行身份验证。我已经复制了一些我发现的配置文件,但不起作用。什么可能是错的? 341
44.2常见问题 342
44.2.1当我尝试登录时,我收到一条错误消息,指出“Bad Credentials”。怎么了? 343
44.2.2当我尝试登录时,我的应用程序进入“无限循环”,发生了什么事? 344
44.2.3我收到一条异常消息“访问被拒绝(用户是匿名的)”。怎么了? 344
44.2.4即使在我退出应用程序之后,为什么还能看到安全的页面? 345
44.2.5我得到一个异常,消息“在SecurityContext中没有找到认证对象”。怎么了? 345
44.2.6我无法使LDAP认证正常工作。我的配置有什么问题? 345
44.2.7会话管理 346
44.2.8我使用Spring Security的并发会话控制来防止用户一次登录多次。登录后打开另一个浏览器窗口时,不会阻止我再次登录。为什么我可以多次登录? 347
44.2.9为什么在通过Spring Security进行身份验证时会话ID发生了变化? 347
44.2.10我正在使用Tomcat(或其他一些servlet容器),并为我的登录页面启用了HTTPS,之后切换回HTTP。这是行不通的 - 我只是在认证之后回到登录页面。 347
44.2.11我没有在HTTP和HTTPS之间切换,但是我的会话仍然丢失 348
44.2.12我试图使用并发会话控制支持,但是不会让我重新登录,即使我确定我已经注销并且没有超出允许的会话。 348
44.2.13 Spring Security正在创建一个会话,即使我已经配置了它,通过设置create-session属性为永远不会。 348
44.2.14执行POST时,我得到了一个403 Forbidden 349
44.2.15我正在使用RequestDispatcher将请求转发到另一个URL,但是我的安全限制没有被应用。 349
44.2.16我已经将Spring Security的元素添加到我的应用程序上下文中,但是如果将安全注释添加到我的Spring MVC控制器bean(Struts操作等)中,那么它们似乎没有效果。 349
44.2.17我有一个肯定被认证的用户,但是当我在一些请求期间尝试访问SecurityContextHolder时,认证是空的。为什么我看不到用户信息? 350
44.2.18在使用URL属性时,授权JSP标记不尊重我的方法安全注释。 350
44.3 Spring安全体系结构问题 350
44.3.1我如何知道X是哪个包? 350
44.3.2名称空间元素如何映射到传统的bean配置? 351
44.3.3“ROLE_”是什么意思,为什么我的角色名字需要它? 351
44.3.4如何知道添加到我的应用程序中的哪些依赖关系与Spring Security一起使用? 352
44.3.5运行嵌入式ApacheDS LDAP服务器需要哪些依赖关系? 352
44.3.6什么是UserDetailsService,我需要一个吗? 353
44.4共同的“Howto”请求 353
44.4.1我需要登录更多的信息,而不仅仅是用户名。如何添加对额外登录字段(例如公司名称)的支持? 354
44.4.2如果只有所请求的URL的片段值不同(例如/ foo#bar和/ foo#blah),我该如何应用不同的拦截url链接? 354
44.4.3如何在UserDetailsService中访问用户的IP地址(或其他Web请求数据)? 354
44.4.4如何从UserDetailsService访问HttpSession? 355
44.4.5如何在UserDetailsService中访问用户的密码? 355
44.4.6如何动态定义应用程序中的安全URL? 355
44.4.7如何针对LDAP进行身份验证,但从数据库加载用户角色? 357
44.4.8我想修改由命名空间创建的bean的属性,但是模式中没有任何东西支持它。我可以做什么放弃命名空间的使用? 358
45.从3.x迁移到4.x 359
				
AuthenticationManager 处理Authentication请求,上一篇博客已经介绍了AuthenticationSpring Security在进行身份验证时,会创建身份验证令牌,即Authentication实例,提供给AuthenticationManager接口的实现进行处理。 Spring Security:身份验证令牌Authentication介绍与Debug分析 public interface AuthenticationManager { * 尝试对传
.addFilter(new JwtAuthenticationFilter(authenticationManager())) 这两行,将我们定义的JWT方法加入SpringSecurity的处理流程中。 四:简单测试 下面对我们的程序进行简单的验证: 1.请求获取用户列表接口...
认证管理器 Authentication Manager 是一个用 Swift 编写的 iOS 框架,旨在帮助应用程序内身份验证。 身份验证管理器当前支持单一身份验证类型:PIN。 PIN 正是它在罐头上所说的:个人识别码,在这种情况下是一个 4 位长的数字代码。 AuthenticationManager会无法通过 ,但希望可在未来。 现在,要安装 Authentication Manager 框架,只需将其添加为 git 子模块: git submodule add https://github.com/YetiiNet/AuthenticationManager.git AuthenticationManagerFramework 添加子模块后,将AuthenticationManagerFramework目录中的AuthenticationManager.xco
Spring Security 中,可以使用自定义的登录接口来实现自定义的登录逻辑。 首先,你需要继承 `UsernamePasswordAuthenticationFilter` 类并重写 `attemptAuthentication` 方法,在这个方法中编写你的登录逻辑。然后,使用 `AuthenticationManager` 去验证用户名和密码。 接下来,你需要在你的 Spring Security 配置中添加自定义的过滤器,并将其映射到你的登录接口上。你可以使用 `HttpSecurity` 的 `addFilterBefore` 方法来添加过滤器,并使用 `formLogin` 方法来配置登录表单的相关属性,如登录页面的 URL 和登录成功后的跳转页面。 @Override protected void configure(HttpSecurity http) throws Exception { MyCustomAuthenticationFilter filter = new MyCustomAuthenticationFilter(); http.addFilterBefore(filter, UsernamePasswordAuthenticationFilter.class) .formLogin() .loginPage("/login") .defaultSuccessUrl("/home"); 在这段代码中,我们使用了自定义的 `MyCustomAuthenticationFilter` 过滤器来处理登录请求,并配置了登录页面的 URL 为 "/login",登录成功后跳转到页面 "/home"。 希望这对你有帮助!