স্প্রিং সিকিউরিটির সাথে ইউনিট পরীক্ষা করা


140

আমার সংস্থাটি আমাদের পরবর্তী প্রকল্পগুলির মধ্যে এটি ব্যবহার করা উচিত কিনা তা নির্ধারণের জন্য স্প্রিং এমভিসি মূল্যায়ন করে চলেছে। এখনও অবধি আমি যা দেখেছি তা পছন্দ করি এবং এখনই আমি স্প্রিং সিকিউরিটি মডিউলটি একবার দেখে নিচ্ছি এটি নির্ধারণ করতে এটি ব্যবহার করতে পারি / করা উচিত এমন কিছু কিনা।

আমাদের সুরক্ষা প্রয়োজনীয়তাগুলি বেশ বেসিক; ব্যবহারকারীর কেবল সাইটের নির্দিষ্ট অংশগুলিতে অ্যাক্সেস করতে সক্ষম হওয়ার জন্য একটি ব্যবহারকারীর নাম এবং পাসওয়ার্ড সরবরাহ করতে সক্ষম হতে হবে (যেমন তাদের অ্যাকাউন্ট সম্পর্কে তথ্য পেতে); এবং সাইটে বেশ কয়েকটি পৃষ্ঠাগুলি রয়েছে (FAQs, সমর্থন, ইত্যাদি) যেখানে একজন অনামী ব্যবহারকারীকে অ্যাক্সেস দেওয়া উচিত।

যে প্রোটোটাইপটি আমি তৈরি করছি তাতে আমি একটি প্রমাণীকরণকারী ব্যবহারকারীর জন্য সেশনে একটি "লগইনক্রেনডেন্টিয়ালস" অবজেক্ট (যা কেবলমাত্র ব্যবহারকারীর নাম এবং পাসওয়ার্ড সহ) সংরক্ষণ করি; কিছু নিয়ন্ত্রণকারী পরীক্ষা করে দেখুন যে লগ-ইন করা ব্যবহারকারীর নামটির জন্য রেফারেন্স পেতে এই বস্তুটি সেশনে রয়েছে কিনা। আমি তার পরিবর্তে বসন্ত সুরক্ষার সাথে এই বাড়ির উত্থিত যুক্তিটি প্রতিস্থাপন করতে চাই যা "যেভাবে আমরা লগ ইন করা ব্যবহারকারীদের কীভাবে ট্র্যাক করব?" কোনও ধরণের অপসারণ করার দুর্দান্ত সুবিধা পাবে? এবং "আমরা কীভাবে ব্যবহারকারীদের প্রমাণীকরণ করব?" আমার নিয়ামক / ব্যবসায় কোড থেকে।

দেখে মনে হচ্ছে স্প্রিং সিকিউরিটি আপনার অ্যাপের যে কোনও জায়গা থেকে ব্যবহারকারীর নাম / মূল তথ্য অ্যাক্সেস করতে সক্ষম হতে (প্রতি থ্রেড) "প্রসঙ্গ" অবজেক্ট সরবরাহ করে ...

Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();

... যা একেবারে অন-স্প্রিংয়ের মতো বলে মনে হয় যেমন এই অবজেক্টটি একরকম (গ্লোবাল) সিঙ্গলটন।

আমার প্রশ্নটি হ'ল: যদি স্প্রিং সিকিউরিটিতে প্রমাণীকৃত ব্যবহারকারী সম্পর্কে তথ্য অ্যাক্সেসের এটি স্ট্যান্ডার্ড উপায় হয় তবে সিকিউরিটি কনটেস্টে কোনও প্রমাণীকরণ অবজেক্টটি ইনজেক্ট করার স্বীকৃত উপায় কী যাতে ইউনিট পরীক্ষাগুলির প্রয়োজন হলে এটি আমার ইউনিট পরীক্ষার জন্য উপলব্ধ? অনুমোদিত ব্যবহারকারী?

প্রতিটি পরীক্ষার মামলার সূচনা পদ্ধতিতে আমার কি তারটি লাগানো দরকার?

protected void setUp() throws Exception {
    ...
    SecurityContextHolder.getContext().setAuthentication(
        new UsernamePasswordAuthenticationToken(testUser.getLogin(), testUser.getPassword()));
    ...
}

এটি অত্যধিক ভারবস বলে মনে হচ্ছে। কোন সহজ উপায় আছে?

SecurityContextHolderবস্তু নিজেই খুব আন-বসন্ত-মত মনে হয় ...

উত্তর:


48

সমস্যাটি হ'ল স্প্রিং সিকিউরিটি কনটেইনারটিতে শিম হিসাবে প্রমাণীকরণের সামগ্রীটি সরবরাহ করে না, তাই এটি সহজেই বাক্সের বাইরে ইনজেকশন বা স্বায়ত্তশাসনের কোনও উপায় নেই।

আমরা স্প্রিং সিকিউরিটি ব্যবহার শুরু করার আগে, আমরা অধ্যক্ষকে সংরক্ষণ করার জন্য ধারকটিতে একটি সেশন-স্কোপড শিম তৈরি করব, এটি একটি "প্রমাণীকরণ পরিষেবা" (সিঙ্গেলটন) তে ইনজেকশন করব এবং তারপরে এই সিমকে অন্যান্য পরিষেবাগুলিতে ইনজেক্ট করব যার জন্য বর্তমান অধ্যক্ষের জ্ঞান প্রয়োজন needed

আপনি যদি নিজের প্রমাণীকরণ পরিষেবাটি প্রয়োগ করছেন, আপনি মূলত একই জিনিসটি করতে পারেন: একটি "অধ্যক্ষ" সম্পত্তি সহ একটি সেশন-স্কোপড শিম তৈরি করুন, এটি আপনার প্রমাণীকরণ পরিষেবাতে ইনজেকশন করুন, লেখক পরিষেবাটি সফল লেখায় সম্পত্তি সেট করুন এবং তারপরে আপনার প্রয়োজন হিসাবে লেখক পরিষেবা অন্যান্য মটরশুটিগুলিতে উপলব্ধ করুন।

সিকিউরিটি কনটেক্সটহোল্ডার ব্যবহার করে আমার খুব খারাপ লাগবে না। যদিও। আমি জানি যে এটি একটি স্ট্যাটিক / সিঙ্গেলটন এবং স্প্রিং এই জাতীয় জিনিসগুলি ব্যবহার করে নিরুৎসাহিত করে তবে তাদের বাস্তবায়ন পরিবেশের উপর নির্ভর করে যথাযথ আচরণ করার জন্য যত্ন নেয়: একটি সার্লেট পাত্রে সেশন-স্কোপড, একটি জুনিত পরীক্ষায় থ্রেডযুক্ত ইত্যাদি প্রকৃত সীমিতকরণের কারণ সিঙ্গলটনের মধ্যে এমনটি হয় যখন এটি এমন একটি বাস্তবায়ন সরবরাহ করে যা বিভিন্ন পরিবেশে জটিল নয়।


ধন্যবাদ, এটি দরকারী পরামর্শ। আমি এ পর্যন্ত যা করেছি তা মূলত সিকিউরিটি কনটেক্সটহোল্ডার.সেটকন্টেক্সট () কে কল করা (আমার নিজস্ব কয়েকটি মোড়কের পদ্ধতিতে, তাই কমপক্ষে এটি কেবলমাত্র একটি শ্রেণীর কাছ থেকে ডাকা হয়েছে) কল করার মাধ্যমে এগিয়ে যাওয়া।
ম্যাট বি

2
যদিও কেবল একটি নোট - আমি মনে করি না সার্ভলেটকন্টেক্সটহোল্ডারের এইচটিপিএসশন সম্পর্কিত কোনও ধারণা আছে বা এটি কোনও ওয়েব সার্ভারের পরিবেশে কাজ করছে কিনা তা জানার কোনও উপায় আছে - এটি থ্রেডলোকল ব্যবহার করে যদি না আপনি এটি অন্য কিছু ব্যবহারের জন্য কনফিগার করেন তবে (কেবলমাত্র অন্য দুটি বিল্টিন মোডই ইনহেরিয়েটেবল ট্র্যাডলোকাল এবং গ্লোবাল)
ম্যাট বি

বসন্তে সেশন / অনুরোধ-স্কোপযুক্ত মটরশুটি ব্যবহারের একমাত্র ত্রুটি হ'ল তারা জুনিট পরীক্ষায় ব্যর্থ হবে। আপনি যা করতে পারেন তা হ'ল একটি কাস্টম স্কোপ বাস্তবায়ন করুন যা উপলব্ধ থাকলে সেশন / অনুরোধ ব্যবহার করবে এবং থ্রেডে ফিরে যেতে হবে। আমার ধারণা হ'ল স্প্রিং সিকিউরিটি একই রকম কিছু করছে ...
ক্লিফ.মায়ার্স

আমার লক্ষ্যটি সেশন ছাড়াই রেস্ট এপিআই তৈরি করা। সম্ভবত একটি রিফ্রেশযোগ্য টোকেন সহ। যদিও এটি আমার প্রশ্নের উত্তর দেয়নি এটি সাহায্য করেছিল। ধন্যবাদ
পোমাগ্রানাইট

166

এটি কেবলমাত্র সাধারণ পদ্ধতিতে করুন এবং তারপরে এটি SecurityContextHolder.setContext()আপনার পরীক্ষার শ্রেণিতে ব্যবহার করুন , উদাহরণস্বরূপ:

নিয়ন্ত্রক:

Authentication a = SecurityContextHolder.getContext().getAuthentication();

টেস্ট:

Authentication authentication = Mockito.mock(Authentication.class);
// Mockito.whens() for your authorization object
SecurityContext securityContext = Mockito.mock(SecurityContext.class);
Mockito.when(securityContext.getAuthentication()).thenReturn(authentication);
SecurityContextHolder.setContext(securityContext);

2
@ লিওনার্দো যেখানে Authentication aএটি নিয়ামকটিতে যুক্ত করা উচিত ? আমি প্রতিটি পদ্ধতির প্রার্থনা বুঝতে পারি? "বসন্তের পথে" কেবল ইনজেকশনের পরিবর্তে এটি যুক্ত করা কি ঠিক হবে?
ওলেগ কুটস

তবে মনে রাখবেন এটি টেস্টএনজির সাথে কাজ করছে না কারণ সিকিউরিটি কনটেক্সটহোল্ডার স্থানীয় থ্রেড ভেরিয়েবল ধরেছে তাই আপনি পরীক্ষার মধ্যে এই পরিবর্তনশীলটি ভাগ করুন ...
asukasz Woźniczka

এটি @BeforeEach(JUnit5) বা @Before(JUnit 4) এ করুন। ভাল এবং সহজ।
ওয়েস্টার্নগুন

30

প্রমাণীকরণ বস্তুগুলি কীভাবে তৈরি এবং ইনজেক্ট করতে হয় সে সম্পর্কে প্রশ্নের উত্তর না দিয়ে, পরীক্ষার ক্ষেত্রে স্প্রিং সিকিউরিটি ৪.০ কিছু স্বাগত বিকল্প সরবরাহ করে। @WithMockUserটীকা একটি উপহাস ব্যবহারকারী নির্দিষ্ট করতে ডেভেলপার একটি ঝরঝরে ভাবে (ঐচ্ছিক কর্তৃপক্ষ, ব্যবহারকারীর নাম, পাসওয়ার্ড এবং ভূমিকা সহ) যোগ করা হয়েছে:

@Test
@WithMockUser(username = "admin", authorities = { "ADMIN", "USER" })
public void getMessageWithMockUserCustomAuthorities() {
    String message = messageService.getMessage();
    ...
}

এছাড়াও , যেমন থেকে ফেরত @WithUserDetailsঅনুকরণ করতে ব্যবহার করার বিকল্প রয়েছেUserDetailsUserDetailsService

@Test
@WithUserDetails("customUsername")
public void getMessageWithUserDetailsCustomUsername() {
    String message = messageService.getMessage();
    ...
}

স্প্রিং সিকিউরিটি রেফারেন্স ডক্সের @ উইথমক ইউজার এবং @ উইথউজারডেটেলস অধ্যায়গুলিতে আরও বিশদ পাওয়া যাবে (যা থেকে উপরের উদাহরণগুলি অনুলিপি করা হয়েছিল)


29

আপনি উদ্বিগ্ন হওয়ার পক্ষে যথেষ্ট সঠিক - স্থায়ী পদ্ধতি কলগুলি ইউনিট পরীক্ষার জন্য বিশেষত সমস্যাযুক্ত কারণ আপনি সহজেই আপনার নির্ভরতাগুলি উপহাস করতে পারবেন না। আমি আপনাকে যেটি দেখাতে যাচ্ছি তা হ'ল কীভাবে স্প্রিং আইওসি পাত্রে আপনার জন্য পরিষ্কার, পরীক্ষামূলক কোড রেখে আপনার জন্য নোংরা কাজ করতে দেওয়া যায়। সিকিউরিটি কনটেক্সটহোল্ডার একটি ফ্রেমওয়ার্ক ক্লাস এবং এটি আপনার নিম্ন-স্তরের সুরক্ষা কোডটির সাথে আবদ্ধ হওয়া ঠিক হতে পারে, তবে আপনি সম্ভবত আপনার ইউআই উপাদানগুলির (যেমন নিয়ন্ত্রণকারী) একটি সুন্দরতর ইন্টারফেস প্রকাশ করতে চান।

ক্লিফ.মায়াররা এর চারপাশে একটি উপায় উল্লেখ করেছে - আপনার নিজস্ব "প্রধান" প্রকারটি তৈরি করুন এবং ভোক্তাদের মধ্যে একটি উদাহরণ ইনজেক্ট করুন। একটি অনুরোধের স্কোপ শিম সংজ্ঞাটির সাথে মিলিত করে 2.x এ বসন্ত < aop: scoped-proxy /> ট্যাগ চালু করা হয়েছে এবং কারখানা-পদ্ধতি সমর্থনটি সর্বাধিক পঠনযোগ্য কোডের টিকিট হতে পারে।

এটি নিম্নলিখিতগুলির মতো কাজ করতে পারে:

public class MyUserDetails implements UserDetails {
    // this is your custom UserDetails implementation to serve as a principal
    // implement the Spring methods and add your own methods as appropriate
}

public class MyUserHolder {
    public static MyUserDetails getUserDetails() {
        Authentication a = SecurityContextHolder.getContext().getAuthentication();
        if (a == null) {
            return null;
        } else {
            return (MyUserDetails) a.getPrincipal();
        }
    }
}

public class MyUserAwareController {        
    MyUserDetails currentUser;

    public void setCurrentUser(MyUserDetails currentUser) { 
        this.currentUser = currentUser;
    }

    // controller code
}

এতদূর জটিল কিছু না, তাই না? আসলে আপনাকে সম্ভবত এর বেশিরভাগটি ইতিমধ্যে করতে হয়েছিল। এরপরে, আপনার শিম প্রসঙ্গে প্রিন্সিপালকে ধরে রাখার জন্য একটি অনুরোধ-স্কোপ করা শিমের সংজ্ঞা দিন:

<bean id="userDetails" class="MyUserHolder" factory-method="getUserDetails" scope="request">
    <aop:scoped-proxy/>
</bean>

<bean id="controller" class="MyUserAwareController">
    <property name="currentUser" ref="userDetails"/>
    <!-- other props -->
</bean>

এওপির যাদুটির জন্য ধন্যবাদ: স্কোপড-প্রক্সি ট্যাগ, স্ট্যাটিক পদ্ধতিটি getUserDetails প্রতিবারই একটি নতুন এইচটিটিপি অনুরোধ আসবে এবং বর্তমান ব্যবহারকারীর সম্পত্তি সম্পর্কিত যে কোনও রেফারেন্স সঠিকভাবে সমাধান করা হবে। এখন ইউনিট টেস্টিং তুচ্ছ হয়ে ওঠে:

protected void setUp() {
    // existing init code

    MyUserDetails user = new MyUserDetails();
    // set up user as you wish
    controller.setCurrentUser(user);
}

আশাকরি এটা সাহায্য করবে!


9

ব্যক্তিগতভাবে আমি আপনার ইউনিট / ইন্টিগ্রেশন পরীক্ষার স্থিতিশীল সিকিউরিটি কনটেক্সটহোল্ডার.সেটসিকিউরিটি কনটেক্সট () মাকেট করার জন্য মকিতো বা ইজিমোকের সাথে পাওয়ারওয়ারকে কেবল ব্যবহার করব eg

@RunWith(PowerMockRunner.class)
@PrepareForTest(SecurityContextHolder.class)
public class YourTestCase {

    @Mock SecurityContext mockSecurityContext;

    @Test
    public void testMethodThatCallsStaticMethod() {
        // Set mock behaviour/expectations on the mockSecurityContext
        when(mockSecurityContext.getAuthentication()).thenReturn(...)
        ...
        // Tell mockito to use Powermock to mock the SecurityContextHolder
        PowerMockito.mockStatic(SecurityContextHolder.class);

        // use Mockito to set up your expectation on SecurityContextHolder.getSecurityContext()
        Mockito.when(SecurityContextHolder.getSecurityContext()).thenReturn(mockSecurityContext);
        ...
    }
}

স্বীকারযোগ্যভাবে এখানে বেশ কিছুটা বয়লার প্লেট কোড রয়েছে যেমন একটি প্রমাণীকরণের বিষয়টিকে উপহাস করুন, প্রমাণীকরণ ফেরত পেতে সিকিউরিটি কনটেক্সটকে উপহাস করুন এবং পরিশেষে সিকিউরিটি কনটেক্সটহোল্ডারকে সিকিউরিটি কনটেক্সট পাওয়ার জন্য উপহাস করুন, তবে এটি খুব নমনীয় এবং আপনাকে নাল প্রমাণীকরণ বস্তুর মতো দৃশ্যের জন্য ইউনিট পরীক্ষার অনুমতি দেয় ইত্যাদি আপনার (অ পরীক্ষা) কোড পরিবর্তন না করেই


7

এই ক্ষেত্রে একটি স্ট্যাটিক ব্যবহার করা নিরাপদ কোড লেখার সর্বোত্তম উপায়।

হ্যাঁ, স্ট্যাটিকস সাধারণত খারাপ হয় - সাধারণত, তবে এই ক্ষেত্রে স্ট্যাটিকগুলি আপনি চান। যেহেতু সুরক্ষা প্রসঙ্গটি বর্তমানে চলমান থ্রেডের সাথে কোনও অধ্যক্ষকে সংযুক্ত করে, তাই সর্বাধিক সুরক্ষিত কোড থ্রেড থেকে যথাসম্ভব সরাসরি স্থিতি অ্যাক্সেস করতে পারে। ইনজেকশন দেওয়া একটি মোড়কের ক্লাসের পিছনে অ্যাক্সেস লুকিয়ে রাখলে আক্রমণকারীকে আক্রমণ করার আরও বেশি পয়েন্ট সরবরাহ করা হয়। তাদের কোডটিতে অ্যাক্সেসের প্রয়োজন হবে না (জার সই করা থাকলে তাদের পরিবর্তন করতে খুব অসুবিধা হবে), তাদের কনফিগারেশনটি ওভাররাইড করার জন্য একটি উপায় প্রয়োজন যা রানটাইম বা ক্লাসপথে কিছু এক্সএমএল পিছলে যেতে পারে। এমনকি টিকাশনের ইনজেকশন ব্যবহার করা বাহ্যিক এক্সএমএল এর সাথে ওভাররিডযোগ্য হবে। এই জাতীয় এক্সএমএল একটি দুর্বৃত্ত অধ্যক্ষের সাথে চলমান সিস্টেমকে ইনজেক্ট করতে পারে।


4

আমি এখানে নিজেই একই প্রশ্ন জিজ্ঞাসা করেছি , এবং আমি সম্প্রতি একটি উত্তর পোস্ট করেছি যা আমি সম্প্রতি পেয়েছি। সংক্ষিপ্ত উত্তরটি হল: একটি ইনজেকশন দিন SecurityContextএবং SecurityContextHolderকেবলমাত্র এটি পেতে আপনার স্প্রিং কনফিগারেশনে উল্লেখ করুনSecurityContext


3

সাধারণ

ইতিমধ্যে (সংস্করণ ৩.২ থেকে, ২০১৩ সালে, এসইসি -২২৯৮ এর জন্য ধন্যবাদ ) এনটোটেশন @ অথেন্টিফিকেশন প্রিন্সিপাল ব্যবহার করে প্রমাণীকরণটিকে এমভিসি পদ্ধতিতে ইনজেক্ট করা যেতে পারে :

@Controller
class Controller {
  @RequestMapping("/somewhere")
  public void doStuff(@AuthenticationPrincipal UserDetails myUser) {
  }
}

টেস্ট

আপনার ইউনিট পরীক্ষায় আপনি স্পষ্টতই সরাসরি এই পদ্ধতিটি কল করতে পারেন। ইন্টিগ্রেশন পরীক্ষাগুলি ব্যবহার করে org.springframework.test.web.servlet.MockMvcআপনি org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.user()ব্যবহারকারীকে এইভাবে ইনজেক্ট করতে ব্যবহার করতে পারেন :

mockMvc.perform(get("/somewhere").with(user(myUserDetails)));

এটি কেবলমাত্র সিকিউরিটি কনটেক্সট পূরণ করবে। আপনি যদি নিশ্চিত করতে চান যে ব্যবহারকারী আপনার পরীক্ষার কোনও সেশন থেকে বোঝা হয়ে গেছে, আপনি এটি ব্যবহার করতে পারেন:

mockMvc.perform(get("/somewhere").with(sessionUser(myUserDetails)));
/* ... */
private static RequestPostProcessor sessionUser(final UserDetails userDetails) {
    return new RequestPostProcessor() {
        @Override
        public MockHttpServletRequest postProcessRequest(final MockHttpServletRequest request) {
            final SecurityContext securityContext = new SecurityContextImpl();
            securityContext.setAuthentication(
                new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities())
            );
            request.getSession().setAttribute(
                HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY, securityContext
            );
            return request;
        }
    };
}

2

আমি স্প্রিং এর বিমূর্ত পরীক্ষা ক্লাস এবং উপহাস বস্তু যা নিয়ে কথা বলত না হয় কটাক্ষপাত করা হবে এখানে । তারা আপনার বসন্ত পরিচালিত অবজেক্টগুলি ইউনিট এবং ইন্টিগ্রেশন টেস্টিং সহজতর করে স্ব-ওয়্যারিংয়ের একটি শক্তিশালী উপায় সরবরাহ করে।


এই পরীক্ষাগুলি সহায়ক হলেও, তারা এখানে প্রয়োগ করেছে কিনা তা আমি নিশ্চিত নই। আমার পরীক্ষাগুলির অ্যাপ্লিকেশন কনটেক্সট সম্পর্কিত কোনও ধারণা নেই - তাদের কোনও প্রয়োজন নেই। আমার যা যা দরকার তা নিশ্চিত করা দরকার যে পরীক্ষা পদ্ধতিটি চালুর আগে সিকিউরিটি কনটেক্সটটি জনবহুল হয়েছে - এটি প্রথমে থ্রেডলোকালটিতে সেট করা খারাপ বলে মনে হচ্ছে
ম্যাট বি

1

প্রমাণীকরণ হ'ল সার্ভার পরিবেশে কোনও থ্রেডের সম্পত্তি যেমন এটি ওএসে কোনও প্রক্রিয়ার সম্পত্তি। প্রমাণীকরণের তথ্য অ্যাক্সেসের জন্য বিন বিন্যাস হওয়া কোনও অসুবিধে না হওয়া কনফিগারেশন এবং তারের ওভারহেডের কোনও সুবিধা ছাড়াই হবে।

পরীক্ষার প্রমাণীকরণ সম্পর্কিত বিভিন্ন উপায় রয়েছে যেভাবে আপনি কীভাবে আপনার জীবনকে সহজ করে তুলতে পারেন। আমার পছন্দেরটি হ'ল একটি কাস্টম টিকা রচনা @Authenticatedএবং পরীক্ষার সম্পাদন শ্রোতা যা এটি পরিচালনা করে। DirtiesContextTestExecutionListenerঅনুপ্রেরণার জন্য পরীক্ষা করুন ।


0

অনেক কাজ করার পরে আমি কাঙ্ক্ষিত আচরণটি পুনরুত্পাদন করতে সক্ষম হয়েছি। আমি মকএমভিসি মাধ্যমে লগইন অনুকরণ করেছি। এটি বেশিরভাগ ইউনিট পরীক্ষার জন্য খুব ভারী তবে ইন্টিগ্রেশন পরীক্ষার জন্য সহায়ক।

অবশ্যই আমি স্প্রিং সিকিউরিটি ৪.০ এ নতুন বৈশিষ্ট্যগুলি দেখতে ইচ্ছুক যা আমাদের পরীক্ষা সহজ করে তুলবে।

package [myPackage]

import static org.junit.Assert.*;

import javax.inject.Inject;
import javax.servlet.http.HttpSession;

import org.junit.Before;
import org.junit.Test;
import org.junit.experimental.runners.Enclosed;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.web.FilterChainProxy;
import org.springframework.security.web.context.HttpSessionSecurityContextRepository;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;

@ContextConfiguration(locations={[my config file locations]})
@WebAppConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
public static class getUserConfigurationTester{

    private MockMvc mockMvc;

    @Autowired
    private FilterChainProxy springSecurityFilterChain;

    @Autowired
    private MockHttpServletRequest request;

    @Autowired
    private WebApplicationContext webappContext;

    @Before  
    public void init() {  
        mockMvc = MockMvcBuilders.webAppContextSetup(webappContext)
                    .addFilters(springSecurityFilterChain)
                    .build();
    }  


    @Test
    public void testTwoReads() throws Exception{                        

    HttpSession session  = mockMvc.perform(post("/j_spring_security_check")
                        .param("j_username", "admin_001")
                        .param("j_password", "secret007"))
                        .andDo(print())
                        .andExpect(status().isMovedTemporarily())
                        .andExpect(redirectedUrl("/index"))
                        .andReturn()
                        .getRequest()
                        .getSession();

    request.setSession(session);

    SecurityContext securityContext = (SecurityContext)   session.getAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY);

    SecurityContextHolder.setContext(securityContext);

        // Your test goes here. User is logged with 
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.