Skip to content

Commit fffea84

Browse files
committed
Spring Security y JavaFX parte 2
Configurar Spring Security usando Java, se almacenan los usuarios en una BD MySQL, las contraseñas son protegidas con algoritmos Hash.
1 parent 8319661 commit fffea84

File tree

11 files changed

+461
-0
lines changed

11 files changed

+461
-0
lines changed

.gitignore

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
/security-javafx-1/target/
2+
/security-javafx-1/.idea/
3+
/security-javafx-1/*.iml
4+
5+
/security-javafx-2/target/
6+
/security-javafx-2/.idea/
7+
/security-javafx-2/*.iml

security-javafx-2/pom.xml

+70
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xmlns="http://maven.apache.org/POM/4.0.0"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
5+
http://maven.apache.org/xsd/maven-4.0.0.xsd">
6+
7+
<modelVersion>4.0.0</modelVersion>
8+
9+
<groupId>test</groupId>
10+
<artifactId>secure.javafx</artifactId>
11+
<name>securefx</name>
12+
13+
<packaging>jar</packaging>
14+
<version>1.0-SNAPSHOT</version>
15+
16+
<organization>
17+
<name>carmelo</name>
18+
</organization>
19+
20+
<properties>
21+
<maven.compiler.source>1.8</maven.compiler.source>
22+
<maven.compiler.target>1.8</maven.compiler.target>
23+
</properties>
24+
25+
<build>
26+
<finalName>securefx</finalName>
27+
<plugins>
28+
<plugin>
29+
<groupId>com.zenjava</groupId>
30+
<artifactId>javafx-maven-plugin</artifactId>
31+
<version>8.1.5</version>
32+
<configuration>
33+
<mainClass>test.MainApp</mainClass>
34+
</configuration>
35+
</plugin>
36+
</plugins>
37+
</build>
38+
39+
<dependencies>
40+
41+
<dependency>
42+
<groupId>org.springframework</groupId>
43+
<artifactId>spring-context</artifactId>
44+
<version>4.2.4.RELEASE</version>
45+
</dependency>
46+
<dependency>
47+
<groupId>org.springframework</groupId>
48+
<artifactId>spring-jdbc</artifactId>
49+
<version>4.2.4.RELEASE</version>
50+
</dependency>
51+
52+
<dependency>
53+
<groupId>org.springframework.security</groupId>
54+
<artifactId>spring-security-core</artifactId>
55+
<version>4.0.3.RELEASE</version>
56+
</dependency>
57+
<dependency>
58+
<groupId>org.springframework.security</groupId>
59+
<artifactId>spring-security-config</artifactId>
60+
<version>4.0.3.RELEASE</version>
61+
</dependency>
62+
63+
<dependency>
64+
<groupId>mysql</groupId>
65+
<artifactId>mysql-connector-java</artifactId>
66+
<version>5.1.38</version>
67+
</dependency>
68+
</dependencies>
69+
70+
</project>
Binary file not shown.
Binary file not shown.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package test;
2+
3+
import javafx.fxml.FXMLLoader;
4+
import javafx.scene.Parent;
5+
6+
import java.io.IOException;
7+
8+
/**
9+
* Created by Carmelo Marin Abrego on 01/03/2016.
10+
*/
11+
public class FXMLController {
12+
13+
private static String prefix = "Controller";
14+
15+
private Parent root;
16+
17+
public Parent load() throws IOException {
18+
FXMLLoader loader = new FXMLLoader();
19+
loader.setLocation(getClass().getClassLoader().getResource(getFxmlName()));
20+
loader.setControllerFactory(clz -> this);
21+
return loader.load();
22+
}
23+
24+
private String getFxmlName(){
25+
String name = this.getClass().getName();
26+
name = name.replaceAll("\\.", "/");
27+
28+
if(name.endsWith(prefix)){
29+
name = name.substring(0, name.lastIndexOf(prefix));
30+
}
31+
32+
return name + ".fxml";
33+
}
34+
35+
public Parent getRoot() throws IOException{
36+
if(root == null){
37+
root = load();
38+
}
39+
return root;
40+
}
41+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
package test;
2+
3+
import javafx.event.ActionEvent;
4+
import javafx.fxml.FXML;
5+
import javafx.scene.control.Label;
6+
import javafx.scene.control.PasswordField;
7+
import javafx.scene.control.TextField;
8+
import javafx.scene.paint.Color;
9+
import org.springframework.beans.factory.annotation.Autowired;
10+
import org.springframework.security.access.AccessDeniedException;
11+
import org.springframework.security.authentication.AuthenticationManager;
12+
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
13+
import org.springframework.security.core.Authentication;
14+
import org.springframework.security.core.AuthenticationException;
15+
import org.springframework.security.core.context.SecurityContextHolder;
16+
import org.springframework.stereotype.Component;
17+
18+
@Component
19+
public class HelloController extends FXMLController {
20+
21+
@Autowired
22+
public AuthenticationManager authManager;
23+
24+
@Autowired
25+
public OperationService operationService;
26+
27+
@FXML
28+
public TextField username;
29+
@FXML
30+
public PasswordField password;
31+
@FXML
32+
public TextField txtDiv;
33+
@FXML
34+
public TextField txtMult;
35+
@FXML
36+
public TextField txtSuma;
37+
@FXML
38+
public Label lblInfo;
39+
40+
@FXML
41+
public void onAuthClick(ActionEvent event) {
42+
try {
43+
final String usuario = username.getText().trim();
44+
final String contrasena = password.getText().trim();
45+
46+
Authentication request = new UsernamePasswordAuthenticationToken(usuario, contrasena);
47+
Authentication result = authManager.authenticate(request);
48+
SecurityContextHolder.getContext().setAuthentication(result);
49+
50+
String name = result.getName();
51+
String roles = result.getAuthorities().toString();
52+
53+
lblInfo.setText("Bienvenido: " + name + " " + roles);
54+
lblInfo.setTextFill(Color.GREEN);
55+
56+
username.clear();
57+
password.clear();
58+
59+
} catch (AuthenticationException e) {
60+
lblInfo.setText("usuario (y/o) contrasena incorrecto.");
61+
lblInfo.setTextFill(Color.RED);
62+
63+
System.out.println("Authentication failed: " + e.getMessage());
64+
}
65+
}
66+
67+
@FXML
68+
public void onSuma(ActionEvent actionEvent) {
69+
try {
70+
clear();
71+
double r = operationService.sumar(2, 2);
72+
txtSuma.setText("Sumar: 2 + 2 = " + r);
73+
} catch (AccessDeniedException e) {
74+
txtSuma.setText(e.getMessage());
75+
}
76+
}
77+
78+
@FXML
79+
public void onMult(ActionEvent actionEvent) {
80+
try {
81+
clear();
82+
double r = operationService.multiplicar(4, 6);
83+
txtMult.setText("Multiplicar: 4 * 6 = " + r);
84+
} catch (AccessDeniedException e) {
85+
txtMult.setText(e.getMessage());
86+
}
87+
}
88+
89+
@FXML
90+
public void onDiv(ActionEvent actionEvent) {
91+
clear();
92+
double r = operationService.dividir(8, 2);
93+
txtDiv.setText("Dividir: 8 / 2 = " + r);
94+
}
95+
96+
@FXML
97+
public void onLogout(ActionEvent actionEvent) {
98+
MainApp.logout();
99+
100+
username.clear();
101+
password.clear();
102+
lblInfo.setText("");
103+
}
104+
105+
private void clear() {
106+
txtSuma.clear();
107+
txtMult.clear();
108+
txtDiv.clear();
109+
}
110+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package test;
2+
3+
import javafx.application.Application;
4+
import javafx.scene.Scene;
5+
import javafx.stage.Stage;
6+
import org.springframework.context.ApplicationContext;
7+
import org.springframework.context.annotation.*;
8+
import org.springframework.security.authentication.AnonymousAuthenticationToken;
9+
import org.springframework.security.authentication.encoding.Md5PasswordEncoder;
10+
import org.springframework.security.core.authority.AuthorityUtils;
11+
import org.springframework.security.core.context.SecurityContextHolder;
12+
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
13+
import org.springframework.security.crypto.password.PasswordEncoder;
14+
15+
@Configuration
16+
@ComponentScan
17+
@Import(SecurityConfiguration.class)
18+
public class MainApp extends Application {
19+
20+
public static void main(String[] args) throws Exception {
21+
22+
Md5PasswordEncoder encode = new Md5PasswordEncoder();
23+
String pass1 = encode.encodePassword("123", null);
24+
String pass2 = encode.encodePassword("456", null);
25+
System.out.println("HASH 123 = " + pass1 + "\nHASH 456 = " + pass2);
26+
27+
launch(args);
28+
}
29+
30+
@Override
31+
public void start(Stage stage) throws Exception {
32+
33+
ApplicationContext context = new AnnotationConfigApplicationContext(MainApp.class);
34+
FXMLController hello = context.getBean(HelloController.class);
35+
36+
initSecurity();
37+
38+
stage.setTitle("JavaFX and Spring Security");
39+
stage.setScene(new Scene(hello.getRoot(), 800, 600));
40+
stage.show();
41+
}
42+
43+
/***
44+
* Iniciar seguridad MODE_GLOBAL establece un unico contexto de seguridad.
45+
* usemos MODE_GLOBAL solo en apliaciones no web.
46+
*/
47+
public static void initSecurity() {
48+
SecurityContextHolder.setStrategyName("MODE_GLOBAL");
49+
initAnonymous();
50+
}
51+
52+
/***
53+
* Agregar un usuario anonimo
54+
*/
55+
public static void initAnonymous() {
56+
AnonymousAuthenticationToken auth = new AnonymousAuthenticationToken(
57+
"anonymous", "anonymous",
58+
AuthorityUtils.createAuthorityList("ROLE_ANONYMOUS"));
59+
60+
SecurityContextHolder.getContext().setAuthentication(auth);
61+
}
62+
63+
/***
64+
* cerrar la session de usuario
65+
*/
66+
public static void logout(){
67+
SecurityContextHolder.clearContext();
68+
initAnonymous();
69+
}
70+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package test;
2+
3+
import org.springframework.stereotype.Component;
4+
5+
/**
6+
* Created by Carmelo Marin Abrego on 04/03/2016.
7+
*/
8+
@Component
9+
public class OperableServiceImpl implements OperationService {
10+
11+
@Override
12+
public double sumar(double a, double b) {
13+
return a + b;
14+
}
15+
16+
@Override
17+
public double multiplicar(double a, double b) {
18+
return a * b;
19+
}
20+
21+
@Override
22+
public double dividir(double a, double b) {
23+
return a / b;
24+
}
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package test;
2+
3+
import org.springframework.security.access.annotation.Secured;
4+
import org.springframework.security.access.prepost.PreAuthorize;
5+
6+
/**
7+
* Created by Carmelo Marin Abrego on 04/03/2016.
8+
*/
9+
public interface OperationService {
10+
11+
@Secured("ROLE_ADMIN")
12+
double sumar(double a, double b);
13+
14+
@PreAuthorize("hasAnyRole('ROLE_USER', 'ROLE_STANDAR')")
15+
double multiplicar(double a, double b);
16+
17+
double dividir(double a, double b);
18+
}

0 commit comments

Comments
 (0)