#java #linux #spring #spring-mvc #spring-security
#java #linux #spring #spring-mvc #spring-безопасность
Вопрос:
мы столкнулись с проблемой с веб-сервисом Spring. Мы используем Spring Security для защиты нашего серверной части администратора для генерации ключей api. Когда мы развертываем его на наших локальных компьютерах (Windows и macOS), он работает нормально, и страница загружается. Если мы попытаемся развернуть его на виртуальной машине с Debian или Ubuntu, незащищенные конечные точки загружаются нормально, но как только мы попадаем на серверную часть администратора, сервер блокируется и не загружает страницу. Мы пытались развернуть его с помощью начальной загрузки задачи gradle из репозитория git, скомпилировать war и загрузить его в экземпляр tomcat, скомпилировать jar и запустить его, но ничего из этого не сработало. Мы не получаем никаких исключений в консоли, и, похоже, она работает нормально, однако после того, как мы попали в серверную часть, другие страницы также не загружаются, даже те, которые работали раньше.
Это конфигурация безопасности
package me.probE466.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.*;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.*;
@EnableWebSecurity
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
// auth
// .inMemoryAuthentication()
// .withUser("user").password("password").roles("ADMIN");
}
protected void configure(HttpSecurity http) throws Exception {
http.csrf().ignoringAntMatchers("/post");
http.authorizeRequests()
.antMatchers("/admin/**")
.authenticated()
.antMatchers("/**").permitAll().and().httpBasic();
}
}
Это контроллер
@RequestMapping(value = "/admin", method = RequestMethod.GET)
public ModelAndView getTest() {
return new ModelAndView("addapi");
}
@RequestMapping(value = "/admin", method = RequestMethod.POST)
public
@ResponseBody
String addApiKey(@RequestParam("userName") String userName) {
User user = new User();
String key = generateSecureApiKey(32);
user.setUserKey(key);
user.setUserName(userName);
userRepository.save(user);
return key;
}
Это наш build.gradle
buildscript {
ext {
springBootVersion = '1.4.1.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: 'java'
apply plugin: 'spring-boot'
jar {
baseName = 'push'
version = '0.0.1-SNAPSHOT'
}
sourceCompatibility = 1.8
targetCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
compile("mysql:mysql-connector-java:5.1.34")
compile('org.springframework.boot:spring-boot-starter-data-jpa')
compile('org.thymeleaf:thymeleaf-spring4')
compile('org.springframework.boot:spring-boot-starter-security')
compile('org.springframework.boot:spring-boot-starter-web')
// https://mvnrepository.com/artifact/commons-lang/commons-lang
compile group: 'commons-lang', name: 'commons-lang', version: '2.6'
testCompile('org.springframework.boot:spring-boot-starter-test')
}
Любая помощь будет оценена
Ответ №1:
Хорошо, мы разобрались…:
В начале работы Spring security (следовало бы прочитать это более внимательно) говорится:
package hello;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@Configuration
public class MvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/home").setViewName("home");
registry.addViewController("/").setViewName("home");
registry.addViewController("/hello").setViewName("hello");
registry.addViewController("/login").setViewName("login");
}
}
Это отсутствовало в нашей конфигурации. До сих пор не знаю, почему это сработало на нашем клиенте (он по-прежнему работает без него на них), но не на linux box, но после того, как мы добавили его, он там тоже работал нормально. Для дальнейшего использования: каждый защищенный контроллер ДОЛЖЕН быть зарегистрирован здесь … по крайней мере, на нашем сервере