solve bug of fechType

This commit is contained in:
PEDSF 2020-11-28 18:05:45 +01:00
parent 4732442672
commit bf2d2a7773
11 changed files with 208 additions and 32 deletions

View file

@ -0,0 +1,31 @@
package org.springframework.samples.petclinic.configuration;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.SimpMessageType;
import org.springframework.security.config.annotation.web.messaging.MessageSecurityMetadataSourceRegistry;
import org.springframework.security.config.annotation.web.socket.AbstractSecurityWebSocketMessageBrokerConfigurer;
@Configuration
public class SocketSecurityConfig extends AbstractSecurityWebSocketMessageBrokerConfigurer {
@Override
protected void configureInbound(MessageSecurityMetadataSourceRegistry message) {
// @formatter:off
// message types other than MESSAGE and SUBSCRIBE
message.simpDestMatchers("/app/**").permitAll()
.simpSubscribeDestMatchers("/topic/**").permitAll()
// catch all
.anyMessage().denyAll();
// @formatter:on
}
/**
* Disables CSRF for Websockets.
*/
@Override
protected boolean sameOriginDisabled() {
return true;
}
}

View file

@ -6,6 +6,7 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource; import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment; import org.springframework.core.env.Environment;
import org.springframework.samples.petclinic.common.CommonAttribute;
import org.springframework.samples.petclinic.common.CommonEndPoint; import org.springframework.samples.petclinic.common.CommonEndPoint;
import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity;
@ -26,8 +27,8 @@ import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@Configuration @Configuration
@EnableWebSecurity @EnableWebSecurity(debug = true)
@PropertySource("classpath:application.properties") @PropertySource("classpath:oauth2.properties")
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
private static final String CLIENT_PROPERTY_KEY = "spring.security.oauth2.client.registration."; private static final String CLIENT_PROPERTY_KEY = "spring.security.oauth2.client.registration.";
@ -71,8 +72,8 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
.loginPage(CommonEndPoint.LOGIN) .loginPage(CommonEndPoint.LOGIN)
.loginProcessingUrl(CommonEndPoint.LOGIN) .loginProcessingUrl(CommonEndPoint.LOGIN)
.defaultSuccessUrl(CommonEndPoint.LOGIN_SUCCESS, true) .defaultSuccessUrl(CommonEndPoint.LOGIN_SUCCESS, true)
.usernameParameter("email") .usernameParameter(CommonAttribute.EMAIL)
.passwordParameter("password") .passwordParameter(CommonAttribute.PASSWORD)
.failureUrl(CommonEndPoint.LOGIN) .failureUrl(CommonEndPoint.LOGIN)
.permitAll() .permitAll()
.and() .and()
@ -124,6 +125,10 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
return CommonOAuth2Provider.GITHUB.getBuilder(client).clientId(clientId).clientSecret(clientSecret).build(); return CommonOAuth2Provider.GITHUB.getBuilder(client).clientId(clientId).clientSecret(clientSecret).build();
} }
if (client.equals("twitter")) {
return ClientRegistration.withRegistrationId("twitter").clientId(clientId).clientSecret(clientSecret).build();
}
return null; return null;
} }

View file

@ -30,7 +30,7 @@ public class WebSocketConfig extends AbstractSecurityWebSocketMessageBrokerConfi
@Override @Override
public void configureMessageBroker(MessageBrokerRegistry config) { public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic"); config.enableSimpleBroker("/topic/public");
config.setApplicationDestinationPrefixes("/app"); config.setApplicationDestinationPrefixes("/app");
} }
@ -39,11 +39,7 @@ public class WebSocketConfig extends AbstractSecurityWebSocketMessageBrokerConfi
registry.addEndpoint("/websocket").setAllowedOrigins("*").withSockJS(); registry.addEndpoint("/websocket").setAllowedOrigins("*").withSockJS();
} }
@Override
protected void configureInbound(MessageSecurityMetadataSourceRegistry message) {
message.nullDestMatcher().permitAll().simpDestMatchers("/app/**").permitAll()
.simpSubscribeDestMatchers("/topic/**").permitAll().anyMessage().denyAll();
}
@Override @Override
protected boolean sameOriginDisabled() { protected boolean sameOriginDisabled() {

View file

@ -80,7 +80,7 @@ class OwnerController extends WebSocketSender {
@GetMapping(CommonEndPoint.OWNERS_FIND) @GetMapping(CommonEndPoint.OWNERS_FIND)
public String initFindForm(Map<String, Object> model) { public String initFindForm(Map<String, Object> model) {
model.put(CommonAttribute.OWNER, new OwnerDTO()); model.put(CommonAttribute.OWNER, new OwnerDTO());
sendSuccessMessage("TEST WEBSOCKET");
return CommonView.OWNER_FIND_OWNERS; return CommonView.OWNER_FIND_OWNERS;
} }
@ -105,12 +105,13 @@ class OwnerController extends WebSocketSender {
else if (results.size() == 1) { else if (results.size() == 1) {
// 1 owner found // 1 owner found
owner = results.iterator().next(); owner = results.iterator().next();
sendSuccessMessage("TEST WEBSOCKET");
return CommonView.OWNER_OWNERS_R + owner.getId(); return CommonView.OWNER_OWNERS_R + owner.getId();
} }
else { else {
// multiple owners found // multiple owners found
model.put(CommonAttribute.SELECTIONS, results); model.put(CommonAttribute.SELECTIONS, results);
sendSuccessMessage("TEST WEBSOCKET");
return CommonView.OWNER_OWNERS_LIST; return CommonView.OWNER_OWNERS_LIST;
} }
} }
@ -119,6 +120,7 @@ class OwnerController extends WebSocketSender {
public String initUpdateOwnerForm(@PathVariable("ownerId") int ownerId, Model model) { public String initUpdateOwnerForm(@PathVariable("ownerId") int ownerId, Model model) {
OwnerDTO ownerDTO = this.ownerService.findById(ownerId); OwnerDTO ownerDTO = this.ownerService.findById(ownerId);
model.addAttribute(CommonAttribute.OWNER, ownerDTO); model.addAttribute(CommonAttribute.OWNER, ownerDTO);
sendSuccessMessage("TEST WEBSOCKET");
return CommonView.OWNER_CREATE_OR_UPDATE; return CommonView.OWNER_CREATE_OR_UPDATE;
} }
@ -153,6 +155,7 @@ class OwnerController extends WebSocketSender {
} }
modelAndView.addObject(CommonAttribute.OWNER, owner); modelAndView.addObject(CommonAttribute.OWNER, owner);
sendSuccessMessage("TEST WEBSOCKET");
return modelAndView; return modelAndView;
} }

View file

@ -16,6 +16,7 @@ public class WebSocketSender {
@Autowired @Autowired
SimpMessagingTemplate simpMessagingTemplate; SimpMessagingTemplate simpMessagingTemplate;
public void sendMessage(String message, String type) { public void sendMessage(String message, String type) {
// Send message asynchronously // Send message asynchronously
new Thread(new Runnable() { new Thread(new Runnable() {

View file

@ -29,6 +29,8 @@ spring.resources.cache.cachecontrol.max-age=12h
#logging.level.org.springframework.web: DEBUG #logging.level.org.springframework.web: DEBUG
#logging.level.org.hibernate: DEBUG #logging.level.org.hibernate: DEBUG
#logging.level.org.springframework.context.annotation=TRACE #logging.level.org.springframework.context.annotation=TRACE
logging.level.org.springframework.security=TRACE
logging.level.org.springframework.web=TRACE
spring.datasource.hikari.connectionTimeout=20000 spring.datasource.hikari.connectionTimeout=20000
spring.datasource.hikari.maximumPoolSize=5 spring.datasource.hikari.maximumPoolSize=5
@ -40,20 +42,6 @@ spring.datasource.password=
spring.h2.console.enabled=true spring.h2.console.enabled=true
spring.h2.console.path=/h2-console spring.h2.console.path=/h2-console
######################################################################### OAUTH2
spring.security.oauth2.client.registration.google.client-id=${OAUTH2_GOOGLE_CLIENT_ID}
spring.security.oauth2.client.registration.google.client-secret=${OAUTH2_GOOGLE_CLIENT_SECRET}
#spring.security.oauth2.client.registration.github.client-id=${OAUTH2_GITHUB_CLIENT_ID}
#spring.security.oauth2.client.registration.github.client-secret=${OAUTH2_GITHUB_CLIENT_SECRET}
spring.security.oauth2.client.registration.github.client-id=d3e47fc2ddd966fa4352
spring.security.oauth2.client.registration.github.client-secret=3bc0f6b8332f93076354c2a5bada2f5a05aea60d
spring.security.oauth2.client.registration.facebook.client-id=121189305185277
spring.security.oauth2.client.registration.facebook.client-secret=42ffe5aa7379e8326387e0fe16f34132
#################################################################### SPRING MAIL #################################################################### SPRING MAIL
spring.mail.host=smtp.mailtrap.io spring.mail.host=smtp.mailtrap.io
spring.mail.port=2525 spring.mail.port=2525

View file

@ -1,6 +1,3 @@
DROP TABLE vets IF EXISTS; DROP TABLE vets IF EXISTS;
CREATE TABLE vets ( CREATE TABLE vets (
id INTEGER IDENTITY PRIMARY KEY, id INTEGER IDENTITY PRIMARY KEY,
@ -78,7 +75,6 @@ CREATE TABLE privileges (
); );
CREATE INDEX privileges_name ON privileges (name); CREATE INDEX privileges_name ON privileges (name);
DROP TABLE users IF EXISTS; DROP TABLE users IF EXISTS;
CREATE TABLE users ( CREATE TABLE users (
id INTEGER IDENTITY PRIMARY KEY, id INTEGER IDENTITY PRIMARY KEY,
@ -115,7 +111,6 @@ CREATE TABLE roles_privileges (
privilege_id INTEGER NOT NULL privilege_id INTEGER NOT NULL
); );
DROP TABLE auth_providers IF EXISTS; DROP TABLE auth_providers IF EXISTS;
CREATE TABLE auth_providers ( CREATE TABLE auth_providers (
id INTEGER IDENTITY PRIMARY KEY, id INTEGER IDENTITY PRIMARY KEY,

View file

@ -62,3 +62,75 @@ CREATE TABLE visits (
); );
ALTER TABLE visits ADD CONSTRAINT fk_visits_pets FOREIGN KEY (pet_id) REFERENCES pets (id); ALTER TABLE visits ADD CONSTRAINT fk_visits_pets FOREIGN KEY (pet_id) REFERENCES pets (id);
CREATE INDEX visits_pet_id ON visits (pet_id); CREATE INDEX visits_pet_id ON visits (pet_id);
DROP TABLE roles IF EXISTS;
CREATE TABLE roles (
id INTEGER IDENTITY PRIMARY KEY,
name VARCHAR(20) NOT NULL
);
CREATE INDEX roles_name ON roles (name);
DROP TABLE privileges IF EXISTS;
CREATE TABLE privileges (
id INTEGER IDENTITY PRIMARY KEY,
name VARCHAR(20) NOT NULL
);
CREATE INDEX privileges_name ON privileges (name);
DROP TABLE users IF EXISTS;
CREATE TABLE users (
id INTEGER IDENTITY PRIMARY KEY,
first_name VARCHAR(30) NOT NULL,
last_name VARCHAR_IGNORECASE(30) NOT NULL,
email VARCHAR(50) NOT NULL,
password VARCHAR(255) NOT NULL,
enabled BOOLEAN NOT NULL,
account_unexpired BOOLEAN NOT NULL DEFAULT true,
account_unlocked BOOLEAN NOT NULL DEFAULT true,
credential_unexpired BOOLEAN NOT NULL DEFAULT true,
telephone VARCHAR(20),
street1 VARCHAR(50),
street2 VARCHAR(50),
street3 VARCHAR(50),
zip_code VARCHAR(6),
city VARCHAR(80),
country VARCHAR(50)
);
CREATE INDEX users_email ON users (email);
DROP TABLE users_roles IF EXISTS;
CREATE TABLE users_roles (
user_id INTEGER NOT NULL,
role_id INTEGER NOT NULL
);
ALTER TABLE users_roles ADD CONSTRAINT fk_users_roles_user_id FOREIGN KEY (user_id) REFERENCES users (id);
ALTER TABLE users_roles ADD CONSTRAINT fk_users_roles_role_id FOREIGN KEY (role_id) REFERENCES roles (id);
CREATE INDEX users_roles_user_id ON users_roles (user_id);
DROP TABLE roles_privileges IF EXISTS;
CREATE TABLE roles_privileges (
role_id INTEGER NOT NULL,
privilege_id INTEGER NOT NULL
);
DROP TABLE auth_providers IF EXISTS;
CREATE TABLE auth_providers (
id INTEGER IDENTITY PRIMARY KEY,
name VARCHAR(20) NOT NULL
);
CREATE INDEX auth_providers_name ON auth_providers (name);
DROP TABLE credentials IF EXISTS;
CREATE TABLE credentials (
id INTEGER IDENTITY PRIMARY KEY,
provider_id INTEGER NOT NULL,
email VARCHAR(50) NOT NULL,
password VARCHAR(255) NOT NULL,
verified BOOLEAN NOT NULL,
token VARCHAR(255) DEFAULT NULL,
expiration DATE DEFAULT NULL
);
ALTER TABLE credentials ADD CONSTRAINT fk_credentials_provider_id FOREIGN KEY (provider_id) REFERENCES auth_providers (id);
CREATE INDEX credentials_email ON credentials (email);

View file

@ -53,3 +53,69 @@ CREATE TABLE IF NOT EXISTS visits (
description VARCHAR(255), description VARCHAR(255),
FOREIGN KEY (pet_id) REFERENCES pets(id) FOREIGN KEY (pet_id) REFERENCES pets(id)
) engine=InnoDB; ) engine=InnoDB;
CREATE TABLE IF NOT EXISTS roles (
id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20) NOT NULL,
INDEX(name)
) engine=InnoDB;
CREATE TABLE IF NOT EXISTS privileges (
id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20) NOT NULL,
INDEX(name)
) engine=InnoDB;
CREATE TABLE IF NOT EXISTS users (
id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
first_name VARCHAR(30) NOT NULL,
last_name VARCHAR_IGNORECASE(30) NOT NULL,
email VARCHAR(50) NOT NULL,
password VARCHAR(255) NOT NULL,
enabled BOOLEAN NOT NULL,
account_unexpired BOOLEAN NOT NULL DEFAULT true,
account_unlocked BOOLEAN NOT NULL DEFAULT true,
credential_unexpired BOOLEAN NOT NULL DEFAULT true,
telephone VARCHAR(20),
street1 VARCHAR(50),
street2 VARCHAR(50),
street3 VARCHAR(50),
zip_code VARCHAR(6),
city VARCHAR(80),
country VARCHAR(50),
INDEX(email)
) engine=InnoDB;
CREATE TABLE IF NOT EXISTS users_roles (
user_id INTEGER NOT NULL,
role_id INTEGER NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(id),
FOREIGN KEY (role_id) REFERENCES roles(id),
INDEX(user_role)
) engine=InnoDB;
CREATE TABLE IF NOT EXISTS roles_privileges (
role_id INTEGER NOT NULL,
privilege_id INTEGER NOT NULL,
FOREIGN KEY (role_id) REFERENCES roles(id),
FOREIGN KEY (privilege_id) REFERENCES privileges(id),
INDEX(role_id)
) engine=InnoDB;
CREATE TABLE IF NOT EXISTS auth_providers (
id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20) NOT NULL,
INDEX(name)
) engine=InnoDB;
CREATE TABLE IF NOT EXISTS credentials (
id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
provider_id INTEGER NOT NULL,
email VARCHAR(50) NOT NULL,
password VARCHAR(255) NOT NULL,
verified BOOLEAN NOT NULL,
token VARCHAR(255) DEFAULT NULL,
expiration DATE DEFAULT NULL,
FOREIGN KEY (provider_id) REFERENCES auth_providers(id),
INDEX(email)
) engine=InnoDB;

View file

@ -0,0 +1,18 @@
spring.security.oauth2.client.registration.google.client-id=${OAUTH2_GOOGLE_CLIENT_ID}
spring.security.oauth2.client.registration.google.client-secret=${OAUTH2_GOOGLE_CLIENT_SECRET}
#spring.security.oauth2.client.registration.github.client-id=${OAUTH2_GITHUB_CLIENT_ID}
#spring.security.oauth2.client.registration.github.client-secret=${OAUTH2_GITHUB_CLIENT_SECRET}
spring.security.oauth2.client.registration.github.client-id=d3e47fc2ddd966fa4352
spring.security.oauth2.client.registration.github.client-secret=3bc0f6b8332f93076354c2a5bada2f5a05aea60d
spring.security.oauth2.client.registration.facebook.client-id=121189305185277
spring.security.oauth2.client.registration.facebook.client-secret=42ffe5aa7379e8326387e0fe16f34132
#spring.security.oauth2.client.registration.twitter.client-id=YrtJmnJJjpxEH3289eVyFxCNt
#spring.security.oauth2.client.registration.twitter.client-secret=aMMFcgJlGpSKvAuiwBgWSXCzjzcOezLgGZtkdmGISUPk7CIzcB
#spring.security.oauth2.client.registration.linkedin.client-id=121189305185277
#spring.security.oauth2.client.registration.linkedin.client-secret=42ffe5aa7379e8326387e0fe16f34132

View file

@ -1,7 +1,8 @@
var stompClient = null;
function displayMessage() { function displayMessage() {
var socket = new SockJS('/websocket'); var socket = new SockJS('/websocket');
var stompClient = Stomp.over(socket); stompClient = Stomp.over(socket);
stompClient.connect({}, function (frame) { stompClient.connect({}, function (frame) {
stompClient.subscribe('/topic/public', function (socketMessage) { stompClient.subscribe('/topic/public', function (socketMessage) {