0

Spring Security に問題があります。

私はmysqlデータチェックで認証しようとしています。AngularJs、Spring Boot、Spring Security を使用しています。

$http.post(...) によって呼び出される webservice rest があります。アプリを起動し、Chrome プラグイン "Advanced Rest Client" > " http://localhost:8080/check-login " を使用して Web サービスをテストすると、動作し、コード 200:OK を受け取りました。

しかし、同じ URL を使用して Chrome 経由で Web サービスにアクセスしたい場合。認証用の開口部があるウィンドウ。Spring Securityによる事前認証だと思います。しかし、無効にする方法がわかりません。

ブラウザでWebサービスにアクセスしたいときに、「http://localhost:8080/check-login 401 unauthaurized」と表示されたため、これは問題です

編集:これは私のコードです:

HTML :

<form role="form" ng-submit="controller.login()">

    <div class="form-group">
        <label for="username">Username:</label> 
        <input type="text" class="form-control" id="username" name="username" ng-model="controller.credentials.username"/>
    </div>

    <div class="form-group">
        <label for="password">Password:</label> 
        <input type="password" class="form-control" id="password" name="password" ng-model="controller.credentials.password"/>
    </div>

    <button type="submit" class="btn btn-primary">Submit</button>

</form>

JS:

myModule.controller('NavCtrl',function($rootScope, $location, $http){

    var self = this

    var authenticate = function(credentials, callback) {


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

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

    }

    authenticate();
    self.credentials = {};

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

});

私のJava REST:

@RestController
public class TestRest {

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

}

私の Java Spring Boot とセキュリティ構成:

@SpringBootApplication
public class BusinessBootApplication {

    public static void main(String[] args) {
        SpringApplication.run(BusinessBootApplication.class, args);
    }

    @Configuration
    @Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
    protected static class SecurityConfiguration extends WebSecurityConfigurerAdapter{
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
            .httpBasic()
            .and()
            .authorizeRequests()
            .antMatchers("/index.html","/home.html","/login.html","/").permitAll()
            .anyRequest()
            .authenticated()
            .and()
            .addFilterAfter(new CsrfHeaderFilter(), CsrfFilter.class)
            .csrf()
            .csrfTokenRepository(csrfTokenRepository());
        }

        private CsrfTokenRepository csrfTokenRepository() {
            HttpSessionCsrfTokenRepository repo = new HttpSessionCsrfTokenRepository();
            repo.setHeaderName("X-XSRF-TOKEN");
            return repo;
        }
    }
}

最後に、UserDetailsS​​ervice に関する私の Java

@Service
public class UserDetailsServiceImpl implements UserDetailsService {

    public UserDao userDao;

    @Autowired
    public UserDetailsServiceImpl(UserDao _userDao) {
        super();
        userDao = _userDao;
    }

    @Override
    public UserDetails loadUserByUsername(String arg0) throws UsernameNotFoundException {

        UserDetailsImpl userDetailsImpl = null;

        User user = userDao.findByLogin(arg0);

        if(user == null){
            throw new UsernameNotFoundException("Login not found");
        } else{
            userDetailsImpl = new UserDetailsImpl(user);
        }

        return userDetailsImpl;
    }

}




public class UserDetailsImpl implements UserDetails {

    /** The Constant serialVersionUID. */
    private static final long serialVersionUID = 1L;

    /** The _username. */
    private String username;

    /** The _password. */
    private String password;

    public UserDetailsImpl(User user) {
        username = user.getLogin();
        password = user.getPwd();
    }

    /**
     * @param password the password to set
     */
    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public String getPassword() {
        // TODO Auto-generated method stub
        return null;
    }

    /**
     * @param username the username to set
     */
    public void setUsername(String username) {
        this.username = username;
    }

    @Override
    public String getUsername() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public boolean isAccountNonExpired() {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean isAccountNonLocked() {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean isEnabled() {
        // TODO Auto-generated method stub
        return false;
    }

}

アイデアはありますか?ありがとう

4

3 に答える 3

1

このウィンドウは基本認証ウィンドウで、コードでは基本認証 ( httpBasic )を使用しています。

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

したがって、保護された URL にアクセスしようとしている場合は、基本認証を適用するように春のセキュリティを構成します。

この構成に基づいて、認証ヘッダー (ユーザー資格情報を含む) が含まれている場合、Chrome は http 要求をチェックします。はいの場合、認証ウィンドウは開かれません。それ以外の場合、Chrome は認証ウィンドウを開いてユーザー名とパスワードを挿入します。

ウィンドウの問題を解決するには、以下のコードで記述したように、angularJS コードで基本認証を処理する必要があります (chrome 開発者ツールでリクエスト ヘッダーを監視して、このコードが正常に機能しているかどうかを確認してください)。

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

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

注: Advanced Rest Client Tool を使用している場合は、基本認証ヘッダーを渡すことができます。このヘッダーを渡さない場合、認証ウィンドウは開かれません。

于 2016-05-17T20:17:22.640 に答える
0

Chrome は、信頼済みサイトの設定を Internet Explorer と同じインターネット オプションから取得します。ここから Chrome からダイアログにアクセスできます。

プロパティ -> 詳細設定を表示 -> プロキシ設定を変更 -> セキュリティ -> 信頼済みサイト

注意: 信頼済みサイトに初めてアクセスするときは、ログインするように求められます。

于 2016-05-17T09:49:04.410 に答える
0

/check-login ログインページですか? もし、そうなら-

この URL は、antmatcher("/check-login").permitAll() にも含まれている必要があります。

/check-login

ログインには「check-login」URLを使用します。permitAll に入れない場合、/check-login ページでも認証が必要になります。これにより、Spring Security の認証が無効になります。

于 2016-05-17T09:53:31.823 に答える