В руководстве предлагалось создать класс Loader, который будет заполнять базу данных при создании приложения. Так можно было бы, не прибегая к чистому SQL, создать первого админа, создать роли и привилегии для ролей.
Код: Выделить всё
SetupDataLoaderКласс Но при запуске приложения код из класса не выполняется. Каждый раз после запуска проверяю содержимое db и вижу, что в таблицу User не добавлено ни одной новой строки. Я также пытался вывести сообщение из этого блока кода на консоль - оно не вышло.
МОЕ ПРИЛОЖЕНИЕ
ENTITIES
Код: Выделить всё
@Entity
@Table(name = "users")
@Data
public class UserEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;
@Column(name = "login")
private String login;
@Column(name = "password")
private String password;
@ManyToMany
@JoinTable(
name = "users_roles",
joinColumns = @JoinColumn(
name = "user_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(
name = "role_id", referencedColumnName = "id"))
private Collection roles;
public UserEntity() {}
}
@Entity
@Table(name = "roles")
@Data
public class RoleEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;
@Column(name = "name")
private String name;
@ManyToMany
@JoinTable(
name = "roles_privileges",
joinColumns = @JoinColumn(
name = "role_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(
name = "privilege_id", referencedColumnName = "id"))
private Collection
privileges;
public RoleEntity() {}
public RoleEntity(final String name) {
this.name = name;
}
}
@Entity
@Table(name = "priveleges")
@Data
public class PrivilegeEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(name = "name")
private String name;
@ManyToMany(mappedBy = "privileges")
private Collection roles;
public PrivilegeEntity() {}
public PrivilegeEntity(final String name) {
this.name = name;
}
}
Код: Выделить всё
public interface UserRepo extends CrudRepository {
Optional findByLogin (String login);
}
public interface RoleRepo extends CrudRepository {
Optional findByName(String name);
}
public interface PrivilegeRepo extends CrudRepository
{
Optional findByName(String name);
}
Код: Выделить всё
@EnableWebSecurity
@Configuration
public class SequrityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.csrf(AbstractHttpConfigurer::disable)
.securityContext((securityContext) -> securityContext.requireExplicitSave(true))
.authorizeHttpRequests(authorize -> authorize
.requestMatchers(HttpMethod.GET, "/roleHierarchy")
.hasRole("STAFF"));
return http.build();
}
@Bean
public SecurityExpressionHandler customWebSecurityExpressionHandler() {
DefaultWebSecurityExpressionHandler expressionHandler = new DefaultWebSecurityExpressionHandler();
expressionHandler.setRoleHierarchy(roleHierarchy());
return expressionHandler;
}
@Bean
public RoleHierarchy roleHierarchy() {
RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
String hierarchy = "ROLE_ADMIN > ROLE_MODER \n ROLE_MODER > ROLE_STAFF";
roleHierarchy.setHierarchy(hierarchy);
return roleHierarchy;
}
}
Код: Выделить всё
@Component
public class SetupDataLoader implements ApplicationListener {
private boolean alreadySetup = false;
@Autowired
UserRepo userRepo;
@Autowired
RoleRepo roleRepo;
@Autowired
PrivilegeRepo privilegeRepo;
@Autowired
PasswordEncoder passwordEncoder;
// API
@Override
@Transactional
public void onApplicationEvent(final @NonNull ContextRefreshedEvent event) {
if (alreadySetup) {
return;
}
// == create init privileges
final PrivilegeEntity readPrivilege = createPrivilege("READ_PRIVILEGE");
final PrivilegeEntity userWritePrivilege = createPrivilege("USER_WRITE_PRIVILEGE");
final PrivilegeEntity switchStatePrivilege = createPrivilege("CHANGE_STATE_PRIVILEGE");
final PrivilegeEntity switchWritePrivilege = createPrivilege("SWITCH_WRITE_PRIVILEGE");
final PrivilegeEntity commentWritePrivilege = createPrivilege("COMMENT_WRITE_PRIVILEGE");
// == create init roles;
final List
adminPrivileges = new ArrayList(Arrays
.asList(readPrivilege,
userWritePrivilege,
switchStatePrivilege,
switchWritePrivilege,
commentWritePrivilege));
final List moderPrivileges = new ArrayList(Arrays
.asList(readPrivilege,
switchWritePrivilege,
commentWritePrivilege));
final List staffPrivileges = new ArrayList(Arrays.asList(readPrivilege));
final RoleEntity adminRole = createRole("ROLE_ADMIN", adminPrivileges);
createRole("ROLE_MODER", moderPrivileges);
createRole("ROLE_STAFF", staffPrivileges);
// == create init users FIRST ADMIN in db
createUser("ADMIN", "ADMIN", new ArrayList(Arrays.asList(adminRole)));
alreadySetup = true;
}
@Transactional
public PrivilegeEntity createPrivilege(final String name) {
Optional optPrivilege = privilegeRepo.findByName(name);
PrivilegeEntity privilege;
if (optPrivilege.isPresent())
privilege = optPrivilege.get();
else {
privilege = new PrivilegeEntity(name);
privilege = privilegeRepo.save(privilege);
}
return privilege;
}
@Transactional
public RoleEntity createRole(final String name, final Collection privileges) {
Optional optRole = roleRepo.findByName(name);
RoleEntity role;
if (optRole.isPresent())
role = optRole.get();
else {
role = new RoleEntity(name);
}
role.setPrivileges(privileges);
role = roleRepo.save(role);
return role;
}
@Transactional
public UserEntity createUser(final String login, final String password, final Collection roles) {
Optional optUser = userRepo.findByLogin(login);
UserEntity user;
if (optUser.isPresent())
user = optUser.get();
else {
user = new UserEntity();
user.setLogin(login);
user.setPassword(passwordEncoder.encode(password));
}
user.setRoles(roles);
user = userRepo.save(user);
return user;
}
}
Код: Выделить всё
prototype=# select * from users;
id | login | password
----+-------+----------
(0 rows)
Подробнее здесь: https://stackoverflow.com/questions/790 ... p-is-launc
Мобильная версия