spring nosql
在前面的文章中,我们从一个SQL数据库提供用户和权威检索自定义查询设置弹簧安全配置。
如今,许多现代应用程序都使用NoSQL数据库。 Spring安全性不是NoSQL数据库的现成解决方案。
在这种情况下,我们需要通过实现自定义UserDetailsService提供解决方案。
在此示例中,我们将使用MongoDB数据库。 我将使用docker映像,但是通过从官方网站下载来建立mongodb数据库是一样容易的。
这些是开始使用docker和mongodb的一些命令(如果不使用docker,请忽略它们)
#pull the mongo image
docker pull mongo
#create a mongo container
docker run --name some-mongo -d mongo
#get the docker container id
docker ps
#get the containers ip
docker inspect --format '{{ .NetworkSettings.IPAddress }}' $CID
#connection using the ip retrieved
mongo $mongodb_container_ip
然后,我们将编写一个简单的初始化脚本,称为createuser.js。 该脚本将创建一个包含用户信息的文档,例如用户名密码和授权。
use springsecurity
db.users.insert({"name":"John","surname":"doe","email":"john@doe.com","password":"cleartextpass","authorities":["user","admin"]})
我们将使用mongo cli执行它。
mongo 172.17.0.2:27017 < createuser.js
为了在mongodb中使用spring security,我们需要从users集合中检索用户信息。
第一步是将mongodb依赖项添加到我们的gradle文件中,包括mongodb驱动程序。 请注意,我们将使用名为“ customuserdetails”的配置文件。
group 'com.gkatzioura'
version '1.0-SNAPSHOT'buildscript {repositories {mavenCentral()}dependencies {classpath("org.springframework.boot:spring-boot-gradle-plugin:1.4.0.RELEASE")}
}apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'spring-boot'sourceCompatibility = 1.8repositories {mavenCentral()
}dependencies {compile("org.springframework.boot:spring-boot-starter-web")compile("org.thymeleaf:thymeleaf-spring4")compile("org.springframework.boot:spring-boot-starter-security")compile("org.mongodb:mongo-java-driver:1.3")compile("org.slf4j:slf4j-api:1.6.6")compile("ch.qos.logback:logback-core:1.1.7")compile("ch.qos.logback:logback-classic:1.1.7")testCompile "junit:junit:4.11"
}bootRun {systemProperty "spring.profiles.active", "customuserdetails"
}
然后,我们将创建一个mongodb连接bean。
package com.gkatzioura.spring.security.config;import com.mongodb.Mongo;
import com.mongodb.MongoClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;/*** Created by gkatzioura on 9/27/16.*/
@Configuration
@Profile("customuserdetails")
public class MongoConfiguration {@Beanpublic MongoClient createConnection() {//You should put your mongo ip herereturn new MongoClient("172.17.0.2:27017");}
}
然后,我们将创建一个自定义用户详细信息对象。
package com.gkatzioura.spring.security.model;import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.userdetails.UserDetails;import java.util.Collection;
import java.util.List;/*** Created by gkatzioura on 9/27/16.*/
public class MongoUserDetails implements UserDetails{private String username;private String password;private List<GrantedAuthority> grantedAuthorities;public MongoUserDetails(String username,String password,String[] authorities) {this.username = username;this.password = password;this.grantedAuthorities = AuthorityUtils.createAuthorityList(authorities);}@Overridepublic Collection<? extends GrantedAuthority> getAuthorities() {return grantedAuthorities;}@Overridepublic String getPassword() {return password;}@Overridepublic String getUsername() {return username;}@Overridepublic boolean isAccountNonExpired() {return true;}@Overridepublic boolean isAccountNonLocked() {return true;}@Overridepublic boolean isCredentialsNonExpired() {return true;}@Overridepublic boolean isEnabled() {return true;}
}
下一步,我们将添加一个自定义UserDetailsService,以通过mongodb数据库检索用户详细信息。
package com.gkatzioura.spring.security.service;import com.gkatzioura.spring.security.model.MongoUserDetails;
import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Filters;
import org.bson.Document;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;import java.util.List;/*** Created by gkatzioura on 9/27/16.*/
public class CustomerUserDetailsService implements UserDetailsService {@Autowiredprivate MongoClient mongoClient;@Overridepublic UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {MongoDatabase database = mongoClient.getDatabase("springsecurity");MongoCollection<Document> collection = database.getCollection("users");Document document = collection.find(Filters.eq("email",email)).first();if(document!=null) {String name = document.getString("name");String surname = document.getString("surname");String password = document.getString("password");List<String> authorities = (List<String>) document.get("authorities");MongoUserDetails mongoUserDetails = new MongoUserDetails(email,password,authorities.toArray(new String[authorities.size()]));return mongoUserDetails;}return null;}}
最后一步是使用我们先前实现的自定义UserDetailsService提供spring安全配置。
package com.gkatzioura.spring.security.config;import com.gkatzioura.spring.security.service.CustomerUserDetailsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Profile;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.UserDetailsService;/*** Created by gkatzioura on 9/27/16.*/
@EnableWebSecurity
@Profile("customuserdetails")
public class CustomUserDetailsSecurityConfig extends WebSecurityConfigurerAdapter {@Beanpublic UserDetailsService mongoUserDetails() {return new CustomerUserDetailsService();}@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {UserDetailsService userDetailsService = mongoUserDetails();auth.userDetailsService(userDetailsService);}@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/public").permitAll().anyRequest().authenticated().and().formLogin().permitAll().and().logout().permitAll();}}
运行应用程序问题
gradle bootRun
您可以在github上找到源代码
翻译自: https://www.javacodegeeks.com/2016/09/spring-boot-spring-security-nosql.html
spring nosql