我正在学习通过做一个小项目来使用Spring Boot.目前我得到了主要课程:
package com.recweb.springboot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
/*@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})*/
public class SpringbootApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootApplication.class, args);
}
}
Run Code Online (Sandbox Code Playgroud)
成员类(id,firstname ..),MemberController类:
package com.recweb.springboot;
import java.util.Arrays;
import java.util.List;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MemberController {
@GetMapping("/members")
public List<Member> getAllUsers() {
return Arrays.asList(new Member(1, "amit"));
}
}
Run Code Online (Sandbox Code Playgroud)
和WebSecurityConfig类:
package com.recweb.springboot;
import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Bean
public UserDetailsService userDetailsService() {
InMemoryUserDetailsManager …Run Code Online (Sandbox Code Playgroud) 这一定是一个常见的问题......我觉得在谷歌搜索之后,我一定不能彻底浏览一下这个答案,或者说no1已经问过了......所以请原谅我.
我正在使用Spring Security和Hibernate等.
因此,用户/主体已登录并对其个人资料进行了一些更改.
我使用DAO更新配置文件(UserDetails),我希望我的Principal自动反映此更新.
然而,当我再次获得Principal时,我得到了脏版本(从我的初始登录).
有谁知道如何让Spring Security从Hibernate重新加载更新的UserDetails?
我在spring/spring-mvc中有一个完全使用JSON通信的应用程序.现在我需要通过JSON使用spring security 3(使用LdapAuthenticationProvider)对我的应用程序进行身份验证.
默认的spring seurity提交表单需要这样的POST:
POST /myapp/j_spring_security_check HTTP/1.1
Accept-Encoding: gzip,deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 32
Host: 127.0.0.1:8080
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
j_username=myUsername&j_password=myPass
Run Code Online (Sandbox Code Playgroud)
但我想传递一个像这样的JSON对象:
{"j_username":"myUsername","j_password":"myPass"}
Run Code Online (Sandbox Code Playgroud)
我看了很多帖子喜欢这样,这样其他的或这一个没有运气,在所有的Ajax的情况下完成一个POST像上面.
有任何想法吗?
用户创建帐户后,我想自动登录该用户.
我有标准表单登录由弹簧过滤器处理/postlogin.如果我去http://localhost/postlogin它试图登录我(失败,因为我没有包括post参数),但做出了正确的尝试.
但是如果我想以编程方式记录用户并且我尝试从控制器返回:"forward:/ postlogin"我得到了404.
我假设forward:指令没有通过过滤器,因此没有得到处理UsernamePasswordAuthenticationFilter.
如何以编程方式手动引导登录?我希望在用户创建新帐户后执行此操作(他们应在完成注册后立即登录该帐户).
我正在使用 spring security 来实现程序化的手动用户登录。我有一个场景,我已经确定了用户的身份,并希望让他们登录。我不知道他们的密码,因此无法使用常规登录代码路径,您将表单提交到 url,即通过 servlet 拦截Filter,完成所有的 auth+session 魔术。
我搜索过,似乎大多数人创建了自己的Authentication对象,然后通过以下方式告诉 spring:
PreAuthenticatedAuthenticationToken authentication = new PreAuthenticatedAuthenticationToken(user, "", user.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(authentication);
Run Code Online (Sandbox Code Playgroud)
确实,这是有效的。Spring 甚至为我将其放入会话中,使后续的 http 请求保持其身份验证状态。
但是,我觉得这是一个肮脏的黑客。我将提供一些细节,希望能给出与setAuthentication()在控制器内部使用以实现手动登录相关的问题的具体示例:
给出一个想法,我的配置是:
httpSecurity
.authorizeRequests()
.antMatchers("/test/**").permitAll()
.antMatchers("/admin/**", "/api/admin/**").hasRole("USER_SUPER_ADMIN")
.and()
.formLogin()
.loginPage("/sign-in?sp")
.loginProcessingUrl("/api/auth/sign-in")
.successHandler(createLoginSuccessHandler())
.failureHandler(createLoginFailureHandler())
.permitAll()
.and()
.logout()
.logoutUrl("/api/auth/sign-out")
.logoutSuccessHandler(createLogoutSuccessHandler())
.and()
.sessionManagement()
.maximumSessions(1)
.maxSessionsPreventsLogin(true)
.sessionRegistry(sessionRegistry)
;
Run Code Online (Sandbox Code Playgroud)
上述配置中的要点:
我单步执行代码以查看 spring 如何处理表单登录。正如预期的那样,HttpSecurity当我使用表单登录时,Spring 执行了我的配置告诉它执行的所有会话/登录功能。但是,当我通过 进行自己的自定义/手动登录时SecurityContextHolder.getContext().setAuthentication(),它没有任何这些功能。这是因为 spring 在 servlet 内部完成了所有的会话/登录功能Filter,而我的编程代码不能真正调用过滤器。现在,我可以尝试添加缺少的功能自己,复制其代码:我看到弹簧过滤器用途:ConcurrentSessionControlAuthenticationStrategy,ChangeSessionIdAuthenticationStrategy …