Роль на основе аутентификации в памяти без пароля в Spring Boot Security - PullRequest
0 голосов
/ 27 марта 2020

Я пытаюсь авторизовать URL-адреса пользователей с такими полномочиями, как ADMIN / LEAD / AGENT. UsernamePasswordAuthenticationToken принимает два аргумента, но я бы хотел передать 3 аргумента userid, пароль как null и роль userid.


I have application-users.txt

{
"users": ["userid1","userid2","userid3","userid4"],

"agents": ["userid1"],

"leads": ["userid2"],

"admins": ["userid4"] 
}



@Configuration
@EnableGlobalMethodSecurity(securedEnabled = true)
@EnableWebSecurity
@ConditionalOnWebApplication
@ConfigurationPropertiesScan("com.spectrum.sci.config")
@EnableConfigurationProperties(ApplicationClients.class)
@RequiredArgsConstructor
public class SecurityConfiguration extends WebSecurityConfigurerAdapter{

    private static final Logger log = LoggerFactory.getLogger(SecurityConfiguration.class);


    @Autowired
    OrderDetailsUsers orderDetailsUsers;

    public void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity
        .authorizeRequests()
        .antMatchers("/order/greet").hasAnyAuthority("admins","leads")
        .antMatchers("/order").hasRole("agents")
        .anyRequest()
        .authenticated()
        .and()
        .httpBasic();
    }


    @Bean
    public InMemoryUserDetailsManager inMemoryUserDetailsManager() {
       final InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();

       log.info("Importing {} clients: " , applicationClients.getClients().toString());

       AuthenticationManager authenticationManager = null;

       KeyValues kvAgents = orderDetailsUsers.applicatonUsers.getAgents();
       String keyAgent = kvAgents.getKey();
       String[] valueAgents = kvAgents.getValues();

       for (int i = 0; i < valueAgents.length ; i++) {
           Authentication authentication = 
                   new UsernamePasswordAuthenticationToken(keyAgent, null, valueAgents[i]);
           SecurityContextHolder.getContext().setAuthentication(authentication); 
           authenticationManager.authenticate(authentication);
           manager.setAuthenticationManager(authenticationManager);
       }

       return manager;
    }
}


@Component
public class OrderDetailsUsers {
    private static final Logger log = LoggerFactory.getLogger(OrderDetailsUsers.class);

    private ResourceLoader resourceLoader;

    //@Autowired
    ApplicationUsers applicatonUsers = new ApplicationUsers();

    public OrderDetailsUsers(ResourceLoader resourceLoader) {
        this.resourceLoader = resourceLoader;
    }

    @PostConstruct
    public void init() {
        try {
            log.info("Trying to load users...");
            Resource resource =  resourceLoader.getResource("classpath:application-users.txt");
            InputStream inputStream = resource.getInputStream();

            log.info("inputStream = " + inputStream.toString());

            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
            StringBuilder stringBuilder = new StringBuilder();


            String str;
            while ( (str = bufferedReader.readLine()) != null) {
                stringBuilder.append(str);
            }

            log.info("stringBuilder = " + stringBuilder.toString());

            JsonObject jsonObject = new JsonParser().parse(stringBuilder.toString()).getAsJsonObject();

            JsonArray users = jsonObject.get("users").getAsJsonArray();     
            log.info("users = " + users.toString());            
            String[] strUsersArray = toStringArray(users);
            KeyValues kvUsers = new KeyValues();
            kvUsers.setKey("users");
            kvUsers.setValues(strUsersArray);
            applicatonUsers.setUsers(kvUsers);

            log.info("final users = " + applicatonUsers.getUsers().toString());


            JsonArray agents = jsonObject.get("agents").getAsJsonArray();
            log.info("agents = " + agents.toString());          
            String[] strAgentsArray = toStringArray(agents);            
            KeyValues kvAgents = new KeyValues();
            kvAgents.setKey("agents");
            kvAgents.setValues(strAgentsArray);
            applicatonUsers.setAgents(kvAgents);
            log.info("final Agents = " + applicatonUsers.getAgents().toString());


            JsonArray leads = jsonObject.get("leads").getAsJsonArray();
            log.info("leads = " + leads.toString());            
            String[] strLeadsArray = toStringArray(leads);
            KeyValues kvLeads = new KeyValues();
            kvLeads.setKey("leads");
            kvLeads.setValues(strLeadsArray);
            applicatonUsers.setLeads(kvLeads);
            log.info("final leads = " + applicatonUsers.getLeads().toString());


            JsonArray admins = jsonObject.get("admins").getAsJsonArray();
            log.info("admins = " + admins.toString());          
            String[] strAdminsArray = toStringArray(admins);
            KeyValues kvAdmins = new KeyValues();
            kvAdmins.setKey("admins");
            kvAdmins.setValues(strAdminsArray);
            applicatonUsers.setAdmins(kvAdmins);
            log.info("final admins = " + applicatonUsers.getAdmins().toString());


        } catch(IOException | NullPointerException e) {
            log.error("Failing to load users..." , e);      
        }
    }

    public static String[] toStringArray(JsonArray jsonArray) {
        if (jsonArray == null)
            return null;

        String[] strArray = new String[jsonArray.size()];
        for ( int i =0; i < strArray.length ; i++) {
            strArray[i] = jsonArray.get(i).getAsString();
        }
        return strArray;
    }


}

@Getter
@Setter
@ToString
public class ApplicationUsers {
  private KeyValues users;
  private KeyValues agents;
  private KeyValues leads;
  private KeyValues admins;
}

@Getter
@Setter
@ToString
public class KeyValues {
    private String key;
    private String[] values;
}

UsernamePasswordAuthenticationToken запрашивает два аргумента userid и password. Но я хотел бы передать идентификатор пользователя, пароль как ноль, роль идентификатора пользователя.

Ответы [ 2 ]

1 голос
/ 28 марта 2020

Цель InMemoryUserDetailsManager - просто представить информацию о пользователе в памяти, это услуга userdetails, которая используется поставщиком аутентификации. Пример:

@Bean
public InMemoryUserDetailsManager inMemoryUserDetailsManager() {
    List<UserDetails> listOfUserDetails = new ArrayList<>();
    listOfUserDetails.add(User.withUsername("userName").password(passwordEncoder().encode("pass"))
            .roles("ADMIN", "LEAD","AGENT").build());
    return  new InMemoryUserDetailsManager(listOfUserDetails);

}

Я не думаю, что это хорошее место для манипулирования аутентификацией в bean-компоненте InMemoryUserDetailsManager (у него другое назначение). Затем зарегистрируйте bean-компонент inMemoryUserDetailsManager для authenticationManagerBuilder:

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception
{
    auth.userDetailsService(inMemoryUserDetailsManager());
}

Что касается UsernamePasswordAuthenticationToken, поставщик аутентификации после успешной проверки учетных данных должен вернуть объект UsernamePasswordAuthenticationToken, созданный конструктором 3 аргументов, поскольку он устанавливает для флага аутентификации значение true.

0 голосов
/ 30 марта 2020

Я изменил метод inMemoryUserDetailsManager () и добавил метод passwordEncoder ().

@Bean
public InMemoryUserDetailsManager inMemoryUserDetailsManager() {

  final InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();  

   KeyValues kvAgents = orderDetailsUsers.applicatonUsers.getAgents();
   String keyAgent = kvAgents.getKey();
   String[] valueAgents = kvAgents.getValues();

   for (int i = 0; i < valueAgents.length ; i++) {
          manager.createUser(User.withUsername(valueAgents[i])
                             .password(passwordEncoder().encode(""))
                             .roles(keyAgent)
                             .build());

   }

   KeyValues kvAdmins = orderDetailsUsers.applicatonUsers.getAdmins();
   String keyAdmin = kvAdmins.getKey();
   String[] valueAdmins = kvAdmins.getValues();

   for (int i = 0; i < valueAdmins.length ; i++) {
       manager.createUser(User.withUsername(valueAdmins[i])
                             .password(passwordEncoder().encode(""))
                             .roles(keyAdmin)
                             .build());

   }

   KeyValues kvLeads = orderDetailsUsers.applicatonUsers.getLeads();
   String keyLead = kvLeads.getKey();
   String[] valueLeads = kvLeads.getValues();

   for (int i = 0; i < valueLeads.length ; i++) {
       manager.createUser(User.withUsername(valueLeads[i])
                             .password(passwordEncoder().encode(""))
                             .roles(keyLead)
                             .build());

   }
   return manager;

}


private PasswordEncoder passwordEncoder() {
    return PasswordEncoderFactories.createDelegatingPasswordEncoder();
}
...