第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Spring Security ACL:我無法更新ACL

Spring Security ACL:我無法更新ACL

繁華開滿天機(jī) 2021-05-13 18:19:43
我正在嘗試學(xué)習(xí)一些Spring Security ACL控件并將其應(yīng)用于我的Spring Boot項(xiàng)目。因此,我嘗試重用Spring Security參考中的代碼片段,我對項(xiàng)目需求做了一些調(diào)整。我具有以下組件,以便在啟動時用一些初始值填充數(shù)據(jù)庫。@Componentpublic class AppBootstrap {    private Authority adminAuth;    private User admin;    private TimeSheet timeSheetAdmin;    private final JdbcMutableAclService jdbcMutableAclService;    private final PlatformTransactionManager transactionManager;    @Autowired    public AppBootstrap(JdbcMutableAclService jdbcMutableAclService, PlatformTransactionManager transactionManager) {        this.jdbcMutableAclService = jdbcMutableAclService;        this.transactionManager = transactionManager;    }    @Bean    public CommandLineRunner initialAuthorities(AuthorityRepository authorityRepository) {        return args -> {            adminAuth = new Authority(ROLE_ADMIN);            authorityRepository.save(adminAuth);        };    }    @Bean    public CommandLineRunner initialUsers(UserRepository userRepository) {        return args -> {            admin = new User("admin",                    "{bcrypt}$2a$08$lDnHPz7eUkSi6ao14Twuau08mzhWrL4kyZGGU5xfiGALO/Vxd5DOi", "admin",                    "admin", "admin@example.com", true, getDate(2016, JANUARY, 1));            admin.setAuthorities(asList(adminAuth));            userRepository.save(admin);        };    }    @Bean    public CommandLineRunner initialTimeSheets(TimeSheetRepository timeSheetRepository) {        return args -> {            timeSheetAdmin = new TimeSheet(LocalDate.of(2016, MARCH, 1), admin);            timeSheetRepository.save(timeSheetUser);        };    }    @Bean    public CommandLineRunner initialRights() {        return args -> grantPermission(admin, timeSheetAdmin, ADMINISTRATION);    }每次刷新應(yīng)用程序上下文時都會運(yùn)行此方法。我可以看到,如果僅運(yùn)行一種測試方法(或測試類),則該方法將成功運(yùn)行。這些測試是端到端測試(@RunWith(SpringRunner.class) @SpringBootTest)。另外,@SpringBootApplication獨(dú)自一人也沒問題。但是,如果我一次運(yùn)行所有測試,@SpringBootTest則以下堆棧跟蹤幾乎都失敗了我有一些問題:當(dāng)我運(yùn)行多個測試類時,為什么會發(fā)生此錯誤?如何找到解決方法?有沒有更好的方法可以實(shí)現(xiàn)相同目的?
查看完整描述

2 回答

?
慕俠2389804

TA貢獻(xiàn)1719條經(jīng)驗(yàn) 獲得超6個贊

我遇到過同樣的問題。

就我而言,ACL緩存臟了。每次測試后,我必須清除緩存,然后所有測試都以綠色運(yùn)行,即使同時調(diào)用也是如此。

我為此創(chuàng)建了一個TestExcutionListener。只需用它注釋您的抽象Test類:


@TestExecutionListeners(

    value = ClearAclCacheTestExecutionListener.class,

    mergeMode = TestExecutionListeners.MergeMode.MERGE_WITH_DEFAULTS) 

public class AbstractTest{...}

public class ClearAclCacheTestExecutionListener extends AbstractTestExecutionListener {


    @Autowired

    private AclCache aclCache;


    @Override

    public void beforeTestClass(TestContext testContext) {

        testContext.getApplicationContext()

                .getAutowireCapableBeanFactory()

                .autowireBean(this);

    }


    @Override

    public void afterTestMethod(TestContext testContext) throws Exception {

        super.afterTestMethod(testContext);

        aclCache.clearCache();

    }

}


查看完整回答
反對 回復(fù) 2021-05-26
?
郎朗坤

TA貢獻(xiàn)1921條經(jīng)驗(yàn) 獲得超9個贊

由于這個問題并沒有那么受歡迎,因此我嘗試了一種不同的方法,該方法似乎非常有用:-)


首先,我創(chuàng)建了一個新的ACLService類,以隔離與JdbcMutableAclService的所有交互。


package com.roberto.security.service;


import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.security.acls.model.*;

import org.springframework.stereotype.Service;


/**

 * Service class to handle ACL permissions.

 */

@Service

public class ACLService {

    private final MutableAclService mutableAclService;


    @Autowired

    public ACLService(MutableAclService mutableAclService) {

        this.mutableAclService = mutableAclService;

    }


    /**

     * Insert an ACL entry

     * @param oid represents the model object

     * @param recipient represents the principal (user, group of users, etc)

     * @param permission quite explicit name...

     * @return the new ACL database entry

     */

    public MutableAcl addPermission(ObjectIdentity oid, Sid recipient, Permission permission) {

        MutableAcl acl;


        try {

            acl = (MutableAcl) mutableAclService.readAclById(oid);

        } catch (NotFoundException nfe) {

            acl = mutableAclService.createAcl(oid);

        }


        acl.insertAce(acl.getEntries().size(), permission, recipient, true);

        return mutableAclService.updateAcl(acl);

    }   

}

然后,我創(chuàng)建了另一個集成測試,該測試可以正常運(yùn)行,而沒有IllegalStateException?,F(xiàn)在,我只需要從我的引導(dǎo)程序類中調(diào)用它即可。


package com.roberto.security.service;


import com.roberto.model.TimeSheet;

import org.junit.Test;

import org.junit.runner.RunWith;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.boot.test.context.SpringBootTest;

import org.springframework.security.acls.domain.BasePermission;

import org.springframework.security.acls.domain.ObjectIdentityImpl;

import org.springframework.security.acls.domain.PrincipalSid;

import org.springframework.security.acls.model.*;

import org.springframework.security.test.context.support.WithUserDetails;

import org.springframework.test.annotation.DirtiesContext;

import org.springframework.test.context.junit4.SpringRunner;

import org.springframework.transaction.annotation.Transactional;


import java.util.List;


import static org.junit.Assert.*;

import static org.springframework.test.annotation.DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD;


/**

 * This test handles basic interaction between our codebase

 * Spring Security ACL and the underlying database model

 */

@SpringBootTest

@RunWith(SpringRunner.class)

public class ACLServiceIntegrationTest {


    private Authentication authentication;

    private ObjectIdentity oid ;

    private Sid sid;

    private Permission administration = BasePermission.ADMINISTRATION;


    @Autowired

    private ACLService aclService;


    @Autowired

    private MutableAclService mutableAclService;


    @Autowired

    private PermissionEvaluator permissionEvaluator;


    @Before

    public void setUp() {

        authentication = TestSecurityContextHolder.getContext().getAuthentication();

        sid = new PrincipalSid(((JwtUser) authentication.getPrincipal()).getUsername());

        oid = new ObjectIdentityImpl(TimeSheet.class, 1);

    }


    @Test

    @WithUserDetails("admin")

    public void testBeans() {

        assertNotNull(aclService);

        assertNotNull(mutableAclService);

        assertNotNull(permissionEvaluator);

    }


    @Test

    @Transactional

    @WithUserDetails("admin")

    @DirtiesContext(methodMode = AFTER_METHOD)

    public void addPermissionIntegrationTest() {

        assertFalse(permissionEvaluator.hasPermission(authentication, oid.getIdentifier(), oid.getType(), administration));


        MutableAcl acl = aclService.addPermission(oi, sid, administration);


        assertTrue(permissionEvaluator.hasPermission(authentication, oid.getIdentifier(), oid.getType(), administration));


        assertEquals(TimeSheet.class.toString().split(" ")[1], acl.getObjectIdentity().getType());

        assertTrue(acl.getEntries().stream().anyMatch(e -> e.getSid().equals(sid) && e.getPermission().equals(administration)));

        assertTrue(acl.isGranted(List.of(administration), List.of(sid), true));

    }

}


查看完整回答
反對 回復(fù) 2021-05-26
  • 2 回答
  • 0 關(guān)注
  • 266 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號