Java spring boot是否提供标准的登录和注册支持
我找到了一些关于Java spring boot是否提供标准的登录和注册支持,java,spring,spring-security,spring-boot,Java,Spring,Spring Security,Spring Boot,我找到了一些关于Spring Security登录和注册的教程: 然而,我现在使用的是springboot,我也想找到一个关于这个的教程。问题是,我只能找到OAuth2和SSO (第28点) 如果我想用springboot实现一个简单的登录和注册表单,你知道如何继续吗 编辑: 我在官方文件中找到了。这将实现登录功能,但注册又如何呢?您需要一个userdetails服务来存储和接收userdetails,当然,至少需要一个服务来实际存储用户 例如,此服务: @Service public cl
Spring Security
登录和注册的教程:
然而,我现在使用的是springboot
,我也想找到一个关于这个的教程。问题是,我只能找到OAuth2
和SSO
(第28点)
如果我想用springboot
实现一个简单的登录和注册表单,你知道如何继续吗
编辑:
我在官方文件中找到了。这将实现登录功能,但注册又如何呢?您需要一个userdetails服务来存储和接收userdetails,当然,至少需要一个服务来实际存储用户 例如,此服务:
@Service
public class RegistrationService {
@Resource
private MailService mailer;
@Resource
private UserDataService userDataService;
public boolean createRegistration(RegistryCredentials credentials,
MessageContext context) {
String username = credentials.getUsername();
UserData current = new UserData();
if (userDataService.isAvailable(username)) {
userDataService.addUserData(username, current);
return true;
} else {
context.addMessage(new MessageBuilder().error().source("username")
.code("username.exists").build());
return false;
}
}
public void saveUserData(RegistryCredentials credentials) {
UserData current = userDataService.getUserData(credentials
.getUsername());
current.setCity(credentials.getCity());
current.setEmail(credentials.getEmail());
current.setPassword(credentials.getPassword());
current.setStreet(credentials.getStreet());
current.setFirstname(credentials.getFirstname());
current.setLastname(credentials.getLastname());
current.setUsername(credentials.getUsername());
current.setRegistered(new Date());
Long activationKey = userDataService.updateUserData(current);
mailer.sendSubscriptionEmail(current, activationKey);
}
}
RegistryCredentials是包含用户数据字段和验证注释的标准bean。
您在registrationpage上创建registryCredentials,将其签入服务,服务将创建(并保存)用户详细信息。当然,您必须向SpringSecurity注册您自己的服务实现,因此在安全配置中需要:
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth,
UserDataService userDataService) throws Exception {
auth.userDetailsService(userDataService);
}
对于一个简单的内存解决方案,您可以使用如下UserDataService:
@Service
public class UserDataService implements UserDetailsService {
private HashMap<String, UserData> userData = new HashMap<>();
private HashMap<Long, UserData> activation = new HashMap<>();
public UserDataService() {
UserData admin = new UserData();
admin.setUsername("admin");
admin.setPassword("password");
admin.setActive(true);
userData.put("admin", admin);
}
public boolean isAvailable(String username) {
return !userData.containsKey(username);
}
public void addUserData(String username, UserData data) {
userData.put(username, data);
}
public UserData getUserData(String username) {
return userData.get(username);
}
public Long updateUserData(UserData changed) {
userData.put(changed.getUsername(), changed);
Long random = new SecureRandom().nextLong();
activation.put(random, changed);
return random;
}
public UserData activateAccount(Long key) {
return activation.remove(key);
}
public boolean mayActivate(Date d, UserData data) {
long day = 86400000L;
Date reg = data.getRegistered();
reg.setTime(reg.getTime() + day);
if (d.before(reg)) {
return true;
} else {
return false;
}
}
@Override
public UserDetails loadUserByUsername(String username)
throws UsernameNotFoundException {
UserData user = getUserData(username);
if (user != null) {
return user;
}
throw new UsernameNotFoundException("Username not found");
}
}
@服务
公共类UserDataService实现UserDetailsService{
私有HashMap userData=newhashmap();
私有HashMap激活=新建HashMap();
公共用户数据服务(){
UserData admin=new UserData();
admin.setUsername(“admin”);
管理员设置密码(“密码”);
admin.setActive(true);
userData.put(“admin”,admin);
}
公共布尔值可用(字符串用户名){
return!userData.containsKey(用户名);
}
public void addUserData(字符串用户名、用户数据){
userData.put(用户名、数据);
}
公共用户数据getUserData(字符串用户名){
返回userData.get(用户名);
}
公共长updateUserData(用户数据已更改){
userData.put(changed.getUsername(),changed);
Long random=new SecureRandom().nextLong();
激活。放置(随机、更改);
返回随机;
}
public UserData activateAccount(长键){
返回激活。移除(键);
}
公共布尔值可激活(日期d,用户数据){
长日=86400000L;
Date reg=data.getRegistered();
reg.setTime(reg.getTime()+天);
如果(d.之前(注册)){
返回true;
}否则{
返回false;
}
}
@凌驾
公共用户详细信息loadUserByUsername(字符串用户名)
抛出UsernameNotFoundException{
UserData user=getUserData(用户名);
如果(用户!=null){
返回用户;
}
抛出新的UsernameNotFoundException(“找不到用户名”);
}
}
重要的是,在这种情况下,UserData
必须实现UserDetails
和Principal
,安全身份验证才能真正使用它
这个特殊的解决方案创建了一个注册令牌,以便在首次登录之前使用。但是,这是完全可选的,因为您可以根据需要配置登录过程。回答得非常好,谢谢。我很快就会试试的。虽然这很奇怪,但是没有一个完整的教程来做这些基本的事情。我认为这是可行的。你知道我在哪里可以学到这些吗?在我看来,春天就像一种全新的语言。虽然我知道它不是,但所有这些注释和需要知道使用哪个库和服务…大多数都可以在spring文档中找到。尽管你必须交叉检查不同的主题才能得到你想要的一切。然而,我们在一次研讨会上学习到了这一点。但是,我们的老师在春季文档中向我们展示了一切,所以。。我们不必寻找自己,只需利用提供的资源即可。我也同意,spring实际上几乎是一种新语言,但一旦您了解了模块的基本知识,它是否很容易使用=)