Я пытаюсь настроить вид входа из углового 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
У вас есть этот учебник. Лучший учебник, который вы будете иметь для этой цели. Он идет шаг за шагом от простого приложения к самому сложному с 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;
}
...
}