1

我有一个带有 mongodb 作为数据源的 grails 应用程序,带有 spring security rest 插件。使用 angularjs,我尝试使用 $http.post 调用登录用户,但在浏览器控制台上收到 401 未经授权的错误。

这是我对 spring security rest 插件的 grail 配置:

grails.plugin.springsecurity.userLookup.userDomainClassName = 'projmgmt.Person'
grails.plugin.springsecurity.userLookup.authorityJoinClassName =  'projmgmt.security.PersonRole'
grails.plugin.springsecurity.authority.className = 'projmgmt.security.Role'
grails.plugin.springsecurity.securityConfigType = 'InterceptUrlMap'
grails.plugin.springsecurity.interceptUrlMap = [
    '/':                    ['permitAll'],
    '/assets/**':           ['permitAll'],
    '/partials/**':         ['permitAll'],
    '/api/**':              ['permitAll'],
    '/auth/api/**':         ['permitAll'],
    '/person/**':           ['permitAll'],
    '/**':                  ['isFullyAuthenticated()']
]

grails.plugin.springsecurity.rememberMe.persistent = false
grails.plugin.springsecurity.rest.login.useJsonCredentials = true
grails.plugin.springsecurity.rest.login.endpointUrl =   '/auth/api/login'
grails.plugin.springsecurity.rest.logout.endpointUrl =  '/auth/api/logout'
grails.plugin.springsecurity.rest.token.storage.useGorm = true
grails.plugin.springsecurity.rest.token.storage.gorm.tokenDomainClassName = 'projmgmt.security.AuthenticationToken'
grails.plugin.springsecurity.rest.token.storage.gorm.tokenValuePropertyName = 'token'
grails.plugin.springsecurity.rest.token.storage.gorm.usernamePropertyName = 'username'

grails.plugin.springsecurity.filterChain.chainMap = [
    '/auth/api/**': 'JOINED_FILTERS,-exceptionTranslationFilter,-authenticationProcessingFilter,-securityContextPersistenceFilter',  // Stateless chain
    '/api/**': 'JOINED_FILTERS,-exceptionTranslationFilter,-authenticationProcessingFilter,-securityContextPersistenceFilter',  // Stateless chain
    '/**': 'JOINED_FILTERS,-restTokenValidationFilter,-restExceptionTranslationFilter'                                          // Traditional chain
] 

我调用通过 angularjs $http 服务登录:

$http.post('auth/api/login', { username: $scope.authData.username, password:     $scope.authData.password }, getAuthenticateHttpConfig).
            success(function (data) {

                $rootScope.isAuthenticated = true;
                $rootScope.currentUser = data.username;
                setLocalToken(data.token);
                authService.loginConfirmed({}, function (config) {
                    if (!config.headers["X-Auth-Token"]) {
                        console.log('X-Auth-Token not on original request; adding it');
                        config.headers["X-Auth-Token"] = getLocalToken();
                    }
                    return config;
                });
            }).
            error(function (data) {
                console.log('login error: ' + data);
                $rootScope.$broadcast('event:auth-loginFailed', data);
            });

错误:

 POST http://localhost:8080/projmgmt_server/auth/api/login 401 (Unauthorized) 

有什么建议么?

4

2 回答 2

1

解决了....

启用调试模式后..我开始知道弹簧安全是一个残疾人..所以在查看我的人员类后,我发现我缺少这些属性:

boolean enabled = true
boolean accountExpired
boolean accountLocked
boolean passwordExpired

因此,添加它们后,问题就解决了。

于 2014-06-15T12:15:24.770 回答
0

我的情况是,我修改了 Role 类。由于String authority类的属性只能有一组定义的权限,我将其更改为Enum列即;

class Role implements Serializable {

    private static final long serialVersionUID = 1

    String id
    Authority authority
    Date dateCreated
    Date lastUpdated

    static mapping = {
        authority enumType: 'identity'
    }
}

String通过将权限属性返回到一个类型,我花了一整天的时间来捕捉和解决这个问题。:(

不要在这些课程上搞得太乱。

于 2018-04-10T13:54:26.460 回答