mirror of
https://git.imnavajas.es/jjimenez/erp-imprimelibros.git
synced 2026-01-13 00:48:49 +00:00
trabajando en usuarios
This commit is contained in:
49
src/main/java/com/imprimelibros/erp/users/Role.java
Normal file
49
src/main/java/com/imprimelibros/erp/users/Role.java
Normal file
@ -0,0 +1,49 @@
|
||||
package com.imprimelibros.erp.users;
|
||||
|
||||
import jakarta.persistence.Column;
|
||||
import jakarta.persistence.Entity;
|
||||
import jakarta.persistence.GeneratedValue;
|
||||
import jakarta.persistence.GenerationType;
|
||||
import jakarta.persistence.Id;
|
||||
import jakarta.persistence.Table;
|
||||
|
||||
@Entity
|
||||
@Table(name = "roles")
|
||||
public class Role {
|
||||
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
@Column(name = "id")
|
||||
private Long id;
|
||||
|
||||
@Column(name = "name")
|
||||
private String name;
|
||||
|
||||
public Role() {
|
||||
}
|
||||
|
||||
public Role(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public Long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Long id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Role{" + "id=" + id + ", name='" + name + '\'' + '}';
|
||||
}
|
||||
}
|
||||
9
src/main/java/com/imprimelibros/erp/users/RoleDao.java
Normal file
9
src/main/java/com/imprimelibros/erp/users/RoleDao.java
Normal file
@ -0,0 +1,9 @@
|
||||
package com.imprimelibros.erp.users;
|
||||
|
||||
import com.imprimelibros.erp.users.Role;
|
||||
|
||||
public interface RoleDao {
|
||||
|
||||
public Role findRoleByName(String theRoleName);
|
||||
|
||||
}
|
||||
33
src/main/java/com/imprimelibros/erp/users/RoleDaoImpl.java
Normal file
33
src/main/java/com/imprimelibros/erp/users/RoleDaoImpl.java
Normal file
@ -0,0 +1,33 @@
|
||||
package com.imprimelibros.erp.users;
|
||||
|
||||
import jakarta.persistence.EntityManager;
|
||||
import jakarta.persistence.TypedQuery;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
@Repository
|
||||
public class RoleDaoImpl implements RoleDao {
|
||||
|
||||
private EntityManager entityManager;
|
||||
|
||||
public RoleDaoImpl(EntityManager theEntityManager) {
|
||||
entityManager = theEntityManager;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Role findRoleByName(String theRoleName) {
|
||||
|
||||
// retrieve/read from database using name
|
||||
TypedQuery<Role> theQuery = entityManager.createQuery("from Role where name=:roleName", Role.class);
|
||||
theQuery.setParameter("roleName", theRoleName);
|
||||
|
||||
Role theRole = null;
|
||||
|
||||
try {
|
||||
theRole = theQuery.getSingleResult();
|
||||
} catch (Exception e) {
|
||||
theRole = null;
|
||||
}
|
||||
|
||||
return theRole;
|
||||
}
|
||||
}
|
||||
116
src/main/java/com/imprimelibros/erp/users/User.java
Normal file
116
src/main/java/com/imprimelibros/erp/users/User.java
Normal file
@ -0,0 +1,116 @@
|
||||
package com.imprimelibros.erp.users;
|
||||
|
||||
import jakarta.persistence.*;
|
||||
import java.util.Collection;
|
||||
|
||||
@Entity
|
||||
@Table(name = "users")
|
||||
public class User {
|
||||
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
@Column(name = "id")
|
||||
private Long id;
|
||||
|
||||
@Column(name = "fullname")
|
||||
private String fullName;
|
||||
|
||||
@Column(name = "username")
|
||||
private String userName;
|
||||
|
||||
@Column(name = "password")
|
||||
private String password;
|
||||
|
||||
@Column(name = "enabled")
|
||||
private boolean enabled;
|
||||
|
||||
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
|
||||
@JoinTable(name = "users_roles",
|
||||
joinColumns = @JoinColumn(name = "user_id"),
|
||||
inverseJoinColumns = @JoinColumn(name = "role_id"))
|
||||
private Collection<Role> roles;
|
||||
|
||||
|
||||
/* Constructors */
|
||||
public User() {
|
||||
}
|
||||
|
||||
public User(String fullName, String userName, String password, boolean enabled) {
|
||||
this.fullName = fullName;
|
||||
this.userName = userName;
|
||||
this.password = password;
|
||||
this.enabled = enabled;
|
||||
}
|
||||
|
||||
public User(String fullName, String userName, String password, boolean enabled,
|
||||
Collection<Role> roles) {
|
||||
this.fullName = fullName;
|
||||
this.userName = userName;
|
||||
this.password = password;
|
||||
this.enabled = enabled;
|
||||
this.roles = roles;
|
||||
}
|
||||
|
||||
/* Getters and Setters */
|
||||
|
||||
public Long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Long id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getFullName() {
|
||||
return fullName;
|
||||
}
|
||||
|
||||
public void setFullName(String fullName) {
|
||||
this.fullName = fullName;
|
||||
}
|
||||
|
||||
public String getUserName() {
|
||||
return userName;
|
||||
}
|
||||
|
||||
public void setUserName(String userName) {
|
||||
this.userName = userName;
|
||||
}
|
||||
|
||||
public String getPassword() {
|
||||
return password;
|
||||
}
|
||||
|
||||
public void setPassword(String password) {
|
||||
this.password = password;
|
||||
}
|
||||
|
||||
public boolean isEnabled() {
|
||||
return enabled;
|
||||
}
|
||||
|
||||
public void setEnabled(boolean enabled) {
|
||||
this.enabled = enabled;
|
||||
}
|
||||
|
||||
public Collection<Role> getRoles() {
|
||||
return roles;
|
||||
}
|
||||
|
||||
public void setRoles(Collection<Role> roles) {
|
||||
this.roles = roles;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "User{" +
|
||||
"id=" + id +
|
||||
", fullName='" + fullName + '\'' +
|
||||
", userName='" + userName + '\'' +
|
||||
", password='" + password + '\'' +
|
||||
", enabled=" + enabled +
|
||||
", roles=" + roles +
|
||||
'}';
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,46 @@
|
||||
package com.imprimelibros.erp.users;
|
||||
|
||||
import com.imprimelibros.erp.datatables.DataTablesResponse;
|
||||
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
|
||||
import org.springframework.data.jpa.domain.Specification;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
|
||||
import com.imprimelibros.erp.datatables.DataTablesRequest;
|
||||
import com.imprimelibros.erp.datatables.DataTablesParser;
|
||||
import com.imprimelibros.erp.datatables.DataTable;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.List;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("/users")
|
||||
public class UserController {
|
||||
|
||||
private UserDao repo;
|
||||
|
||||
public UserController(UserDao repo, UserService userService) {
|
||||
this.repo = repo;
|
||||
}
|
||||
|
||||
@PreAuthorize("hasRole('ADMIN') or hasRole('SUPERADMIN')")
|
||||
@GetMapping("/")
|
||||
public DataTablesResponse<Map<String,Object>> datatable(HttpServletRequest request) {
|
||||
|
||||
DataTablesRequest dt = DataTablesParser.from(request);
|
||||
|
||||
Specification<User> base = (root, query, cb) -> cb.conjunction();
|
||||
long total = repo.count();
|
||||
|
||||
return DataTable
|
||||
.of(repo, User.class, dt, List.of(
|
||||
"username", "email", "role" // campos buscables
|
||||
))
|
||||
.where(base)
|
||||
.toJson(total);
|
||||
}
|
||||
}
|
||||
12
src/main/java/com/imprimelibros/erp/users/UserDao.java
Normal file
12
src/main/java/com/imprimelibros/erp/users/UserDao.java
Normal file
@ -0,0 +1,12 @@
|
||||
package com.imprimelibros.erp.users;
|
||||
|
||||
import org.springframework.stereotype.Repository;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
|
||||
|
||||
@Repository
|
||||
public interface UserDao extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {
|
||||
|
||||
|
||||
User findByUserNameAndEnabledTrue(String userName);
|
||||
}
|
||||
@ -0,0 +1,89 @@
|
||||
package com.imprimelibros.erp.users;
|
||||
|
||||
import com.imprimelibros.erp.users.User;
|
||||
import org.springframework.security.core.GrantedAuthority;
|
||||
import org.springframework.security.core.authority.SimpleGrantedAuthority;
|
||||
import org.springframework.security.core.userdetails.UserDetails;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* Adaptador de la entidad User a Spring Security.
|
||||
*/
|
||||
public class UserDetailsImpl implements UserDetails {
|
||||
|
||||
private final User user;
|
||||
|
||||
public UserDetailsImpl(User user) {
|
||||
this.user = user;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<? extends GrantedAuthority> getAuthorities() {
|
||||
// Si tu User tiene un Set<Role>:
|
||||
Set<String> roles = user.getRoles().stream()
|
||||
.map(r -> r.getName()) // ejemplo: "ADMIN", "USER"
|
||||
.collect(Collectors.toSet());
|
||||
|
||||
return roles.stream()
|
||||
.map(role -> new SimpleGrantedAuthority("ROLE_" + role))
|
||||
.collect(Collectors.toSet());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPassword() {
|
||||
return user.getPassword(); // debe estar encriptado (BCrypt)
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getUsername() {
|
||||
return user.getUserName();
|
||||
}
|
||||
|
||||
public String getFullname() {
|
||||
|
||||
return user.getFullName();
|
||||
}
|
||||
|
||||
// 👇 si en la vista usas principal.role, añade este también
|
||||
public String getRole() {
|
||||
return user.getRoles().stream()
|
||||
.map(r -> r.getName()) // "ADMIN", "USER", ...
|
||||
.findFirst()
|
||||
.orElse("-");
|
||||
}
|
||||
|
||||
/** (Opcional) Todos los roles “limpios” por si quieres listarlos. */
|
||||
public java.util.Set<String> getRoleNames() {
|
||||
return user.getRoles().stream()
|
||||
.map(r -> r.getName())
|
||||
.collect(java.util.stream.Collectors.toCollection(LinkedHashSet::new));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAccountNonExpired() {
|
||||
return true; // puedes añadir lógica si quieres
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAccountNonLocked() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCredentialsNonExpired() {
|
||||
return true; // igual que arriba
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEnabled() {
|
||||
return user.isEnabled();
|
||||
}
|
||||
|
||||
public User getUser() {
|
||||
return user;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,8 @@
|
||||
package com.imprimelibros.erp.users;
|
||||
|
||||
import com.imprimelibros.erp.users.User;
|
||||
import org.springframework.security.core.userdetails.UserDetailsService;
|
||||
|
||||
public interface UserService extends UserDetailsService {
|
||||
public User findByUserName(String userName);
|
||||
}
|
||||
@ -0,0 +1,44 @@
|
||||
package com.imprimelibros.erp.users;
|
||||
|
||||
import org.springframework.security.core.GrantedAuthority;
|
||||
import org.springframework.security.core.authority.SimpleGrantedAuthority;
|
||||
import org.springframework.security.core.userdetails.UserDetails;
|
||||
import org.springframework.security.core.userdetails.UsernameNotFoundException;
|
||||
import org.springframework.stereotype.Service;
|
||||
import java.util.Collection;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Service
|
||||
public class UserServiceImpl implements UserService {
|
||||
|
||||
private UserDao userDao;
|
||||
private RoleDao roleDao;
|
||||
|
||||
public UserServiceImpl(UserDao userDao, RoleDao roleDao) {
|
||||
this.userDao = userDao;
|
||||
this.roleDao = roleDao;
|
||||
}
|
||||
|
||||
@Override
|
||||
public User findByUserName(String userName) {
|
||||
// check the database if the user already exists
|
||||
return userDao.findByUserNameAndEnabledTrue(userName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
|
||||
User user = userDao.findByUserNameAndEnabledTrue(username);
|
||||
if (user == null) {
|
||||
throw new UsernameNotFoundException("No existe usuario: " + username);
|
||||
}
|
||||
return new UserDetailsImpl(user);
|
||||
}
|
||||
|
||||
/*public List<User> getUsersList() {
|
||||
return userDao.findAll();
|
||||
}*/
|
||||
|
||||
private Collection<? extends GrantedAuthority> mapRolesToAuthorities(Collection<Role> roles) {
|
||||
return roles.stream().map(role -> new SimpleGrantedAuthority(role.getName())).collect(Collectors.toList());
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user