এই উত্তরে পোস্ট করা অসংখ্য সমাধানগুলির সাথে লড়াই করার পরে, <http>
নেমস্পেস কনফিগারেশনটি ব্যবহার করার সময় কিছু কাজ করার চেষ্টা করার জন্য , অবশেষে আমি একটি পন্থা পেয়েছি যা আসলে আমার ব্যবহারের ক্ষেত্রে কাজ করে। আমার আসলে এটির প্রয়োজন নেই যে স্প্রিং সিকিউরিটি কোনও অধিবেশন শুরু না করে (কারণ আমি অ্যাপ্লিকেশনটির অন্যান্য অংশে সেশন ব্যবহার করি), এটি কেবলমাত্র সেশনে প্রমাণীকরণের "মনে রাখে না" তা মনে করে না (এটি পুনরায় পরীক্ষা করা উচিত) প্রতিটি অনুরোধ)।
প্রথমত, উপরে বর্ণিত "নাল বাস্তবায়ন" কৌশলটি কীভাবে করা যায় তা আমি বুঝতে সক্ষম হয়েছি was আপনার সুরক্ষা কনটেক্সট রেপোসিটরি সেট করার কথা null
বা কোনও অপ-প্রয়োগ বাস্তবায়নের কথা স্পষ্ট ছিল না । প্রাক্তন কাজ করে না কারণ একটি NullPointerException
ভিতরে ফেলে দেওয়া হয় SecurityContextPersistenceFilter.doFilter()
। অন-অপশন বাস্তবায়ন হিসাবে, আমি কল্পনা করতে পারি এমন সহজ পদ্ধতিতে বাস্তবায়ন করার চেষ্টা করেছি:
public class NullSpringSecurityContextRepository implements SecurityContextRepository {
@Override
public SecurityContext loadContext(final HttpRequestResponseHolder requestResponseHolder_) {
return SecurityContextHolder.createEmptyContext();
}
@Override
public void saveContext(final SecurityContext context_, final HttpServletRequest request_,
final HttpServletResponse response_) {
}
@Override
public boolean containsContext(final HttpServletRequest request_) {
return false;
}
}
এর কারণ হল কিছু অদ্ভুত আমার অ্যাপ্লিকেশনে কাজ করে না, ClassCastException
না থাকার response_
প্রকার।
এমনকি ধরে নিয়েছি যে আমি কার্যকরভাবে একটি কার্যকারিতা খুঁজে পেয়েছি যা কার্যকর হয় (সেশনে প্রসঙ্গটি সংরক্ষণ না করে), <http>
কনফিগারেশন দ্বারা নির্মিত ফিল্টারগুলিতে কীভাবে এটি ইনজেক্ট করতে হবে তা নিয়ে এখনও সমস্যা রয়েছে। ডকস অনুসারে আপনি কেবলমাত্র SECURITY_CONTEXT_FILTER
পজিশনে ফিল্টারটি প্রতিস্থাপন করতে পারবেন না । কভারগুলির নীচে যেটি তৈরি করা হয়েছে তাতে আমি wayুকতে পেলাম একমাত্র উপায় ছিল একটি কুরুচিপূর্ণ বিন writeSecurityContextPersistenceFilter
ApplicationContextAware
public class SpringSecuritySessionDisabler implements ApplicationContextAware {
private final Logger logger = LoggerFactory.getLogger(SpringSecuritySessionDisabler.class);
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(final ApplicationContext applicationContext_) throws BeansException {
applicationContext = applicationContext_;
}
public void disableSpringSecuritySessions() {
final Map<String, FilterChainProxy> filterChainProxies = applicationContext
.getBeansOfType(FilterChainProxy.class);
for (final Entry<String, FilterChainProxy> filterChainProxyBeanEntry : filterChainProxies.entrySet()) {
for (final Entry<String, List<Filter>> filterChainMapEntry : filterChainProxyBeanEntry.getValue()
.getFilterChainMap().entrySet()) {
final List<Filter> filterList = filterChainMapEntry.getValue();
if (filterList.size() > 0) {
for (final Filter filter : filterList) {
if (filter instanceof SecurityContextPersistenceFilter) {
logger.info(
"Found SecurityContextPersistenceFilter, mapped to URL '{}' in the FilterChainProxy bean named '{}', setting its securityContextRepository to the null implementation to disable caching of authentication",
filterChainMapEntry.getKey(), filterChainProxyBeanEntry.getKey());
((SecurityContextPersistenceFilter) filter).setSecurityContextRepository(
new NullSpringSecurityContextRepository());
}
}
}
}
}
}
}
যাইহোক, যে সমাধানটি বাস্তবে কাজ করে তা খুব হ্যাকিশ হলেও। কেবলমাত্র Filter
এমন একটি ব্যবহার করুন যা সেশন এন্ট্রি মুছে HttpSessionSecurityContextRepository
দেয় যা তার কাজটি করার সময় দেখায়:
public class SpringSecuritySessionDeletingFilter extends GenericFilterBean implements Filter {
@Override
public void doFilter(final ServletRequest request_, final ServletResponse response_, final FilterChain chain_)
throws IOException, ServletException {
final HttpServletRequest servletRequest = (HttpServletRequest) request_;
final HttpSession session = servletRequest.getSession();
if (session.getAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY) != null) {
session.removeAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY);
}
chain_.doFilter(request_, response_);
}
}
তারপরে কনফিগারেশনে:
<bean id="springSecuritySessionDeletingFilter"
class="SpringSecuritySessionDeletingFilter" />
<sec:http auto-config="false" create-session="never"
entry-point-ref="authEntryPoint">
<sec:intercept-url pattern="/**"
access="IS_AUTHENTICATED_REMEMBERED" />
<sec:intercept-url pattern="/static/**" filters="none" />
<sec:custom-filter ref="myLoginFilterChain"
position="FORM_LOGIN_FILTER" />
<sec:custom-filter ref="springSecuritySessionDeletingFilter"
before="SECURITY_CONTEXT_FILTER" />
</sec:http>