Борьба с добавлением пружинной безопасности для угловых приложений js

0

Я пытаюсь настроить вид входа из углового js в проект весны. Ниже приведен параметр безопасности xml, который у меня есть.

<http auto-config="false" entry-point-ref="loginUrlAuthenticationEntryPoint">
      <intercept-url pattern="/**" access="ROLE_ADMIN"/>
        <custom-filter position="FORM_LOGIN_FILTER" ref="theiaFormAuthenticationFilter"/>
      <custom-filter ref="theiaRestDigestFilter" after="FORM_LOGIN_FILTER" />
      <logout logout-success-url="/#/login" />
      <session-management invalid-session-url="/#/login" />
      <access-denied-handler error-page="/loginFailed"/>
</http>

Это дает мне ERR_TOO_MANY_REDIRECTS всякий раз, когда я пытаюсь перейти на любую страницу даже с localhost/#/login. Пожалуйста помоги. Работал над этим с двух последних дней и не пошел туда.

Спасибо.

Обновить:

Фактически теперь я изменил код, чтобы использовать класс конфигурации безопасности Spring. Его способность дать страницу входа по умолчанию, которая поставляется с весной безопасности. Но я не могу добавить маршрут angularjs для входа. Ниже приведен код безопасности:

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {


@Autowired
public void configureGlobalSecurity(AuthenticationManagerBuilder auth) throws Exception {
    auth.inMemoryAuthentication().withUser("bill").password("abc123").roles("USER");
    auth.inMemoryAuthentication().withUser("admin").password("root123").roles("ADMIN");
    auth.inMemoryAuthentication().withUser("dba").password("root123").roles("ADMIN","DBA");
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    log.info("Configuring theia security settings.");
    http.authorizeRequests()
         .antMatchers("/libs/**").permitAll()
         .anyRequest().authenticated()
        .and()
        .formLogin()
            .loginPage("/#/login").permitAll()
        .and()
        .logout().permitAll();
}
}

Кажется, он не признает /#/login. В этом приложении у нас нет индексной страницы. Он непосредственно должен перейти на страницу входа. В любом случае, чтобы добавить угловой маршрут в файл конфигурации? Я что-то упускаю?

Я следую этому руководству сейчас: https://www.youtube.com/watch?v=1zu8COg80q4

  • 0
    Что такое определение «theiaFormAuthenticationFilter» и «loginUrlAuthenticationEntryPoint»?
  • 0
    какой URL вы вызываете, и на какой URL перенаправить перенаправления? (попытайтесь исключить URL-адреса входа из защищенных, также рассмотрите ресурсы (js, css, images ...))
Показать ещё 1 комментарий
Теги:
spring-security
spring
spring-mvc

1 ответ

0
Лучший ответ

У вас есть этот учебник. Лучший учебник, который вы будете иметь для этой цели. Он идет шаг за шагом от простого приложения к самому сложному с oauth2 и раздробленным сервером. Очень рекомендуется: https://spring.io/guides/tutorials/spring-security-and-angular-js/

РЕДАКТИРОВАТЬ: Если вы используете angularjs, вы не можете делать то, что делаете. Весенняя безопасность просто сэкономит на активах и не будет слушать URL. Это одностраничное приложение, поэтому весь контроль над веб-потоком должен быть на клиенте.

Вы должны использовать что-то вроде этого:

http
        .httpBasic()
      .and()
        .authorizeRequests()
          .antMatchers("/index.html", "/home.html", "/login.html").permitAll()
          .anyRequest().authenticated();

Таким образом, сервер не дает вам ресурса, когда клиент пытается получить его без разрешения. В клиенте вам нужно будет выполнить логику маршрутизации.

На самом деле что-то вроде этого:

angular.module('hello', [ 'ngRoute' ]) // ... omitted code
.controller('navigation',

  function($rootScope, $scope, $http, $location) {

  var authenticate = function(credentials, callback) {

    var headers = credentials ? {authorization : "Basic "
        + btoa(credentials.username + ":" + credentials.password)
    } : {};

    $http.get('user', {headers : headers}).success(function(data) {
      if (data.name) {
        $rootScope.authenticated = true;
      } else {
        $rootScope.authenticated = false;
      }
      callback && callback();
    }).error(function() {
      $rootScope.authenticated = false;
      callback && callback();
    });

  }

  authenticate();
  $scope.credentials = {};
  $scope.login = function() {
      authenticate($scope.credentials, function() {
        if ($rootScope.authenticated) {
          $location.path("/");
          $scope.error = false;
        } else {
          $location.path("/login");
          $scope.error = true;
        }
      });
  };
});

На сервере, когда вы попытаетесь отправить get/user, сервер вернет пользователя сеанса, если пользовательский сеанс жив. Поэтому на сервере вам также нужно:

@SpringBootApplication
@RestController
public class UiApplication {

  @RequestMapping("/user")
  public Principal user(Principal user) {
    return user;
  }

  ...

}
  • 0
    Я видел этот учебник. Но вы можете проверить мое обновление один раз. Угловой маршрут JS, похоже, не распознается! Он переходит на страницу 404 всякий раз, когда я пытаюсь перейти на localhost / # / login
  • 0
    Смотрите мое редактирование. Я взял важные вещи ... Понять простую вещь ... Потому что angularjs на самом деле не разные страницы, а одна страница, которую вы не можете сказать пружиной для перенаправления на другие страницы. Вся логика маршрутизации должна быть на стороне клиента. Вы можете защитить ресурс на сервере только для аутентифицированных пользователей, которые попытаются достичь зоны ограниченного доступа.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню