ওপিতে বর্ণিত ঠিক মতো আমরা এই কাজটি পরিচালনা করতে পেরেছি এবং আশা করি অন্য কেউ সমাধানটি ব্যবহার করতে পারে। আমরা যা করেছি তা এখানে:
সুরক্ষা প্রসঙ্গটি এর মতো সেট আপ করুন:
<security:http realm="Protected API" use-expressions="true" auto-config="false" create-session="stateless" entry-point-ref="CustomAuthenticationEntryPoint">
<security:custom-filter ref="authenticationTokenProcessingFilter" position="FORM_LOGIN_FILTER" />
<security:intercept-url pattern="/authenticate" access="permitAll"/>
<security:intercept-url pattern="/**" access="isAuthenticated()" />
</security:http>
<bean id="CustomAuthenticationEntryPoint"
class="com.demo.api.support.spring.CustomAuthenticationEntryPoint" />
<bean id="authenticationTokenProcessingFilter"
class="com.demo.api.support.spring.AuthenticationTokenProcessingFilter" >
<constructor-arg ref="authenticationManager" />
</bean>
আপনি দেখতে পাচ্ছেন, আমরা একটি কাস্টম তৈরি করেছি AuthenticationEntryPoint
, যা 401 Unauthorized
আমাদের দ্বারা ফিল্টার চেইনে অনুরোধটি প্রমাণিত না হলে মূলত একটি ফিরিয়ে দেয় AuthenticationTokenProcessingFilter
।
কাস্টমআথেন্টিফিকেশন এন্ট্রিপয়েন্ট :
public class CustomAuthenticationEntryPoint implements AuthenticationEntryPoint {
@Override
public void commence(HttpServletRequest request, HttpServletResponse response,
AuthenticationException authException) throws IOException, ServletException {
response.sendError( HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized: Authentication token was either missing or invalid." );
}
}
প্রমাণীকরণ টোকেনপ্রসেসিং ফিল্টার :
public class AuthenticationTokenProcessingFilter extends GenericFilterBean {
@Autowired UserService userService;
@Autowired TokenUtils tokenUtils;
AuthenticationManager authManager;
public AuthenticationTokenProcessingFilter(AuthenticationManager authManager) {
this.authManager = authManager;
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
@SuppressWarnings("unchecked")
Map<String, String[]> parms = request.getParameterMap();
if(parms.containsKey("token")) {
String token = parms.get("token")[0]; // grab the first "token" parameter
// validate the token
if (tokenUtils.validate(token)) {
// determine the user based on the (already validated) token
UserDetails userDetails = tokenUtils.getUserFromToken(token);
// build an Authentication object with the user's info
UsernamePasswordAuthenticationToken authentication =
new UsernamePasswordAuthenticationToken(userDetails.getUsername(), userDetails.getPassword());
authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails((HttpServletRequest) request));
// set the authentication into the SecurityContext
SecurityContextHolder.getContext().setAuthentication(authManager.authenticate(authentication));
}
}
// continue thru the filter chain
chain.doFilter(request, response);
}
}
স্পষ্টতই, TokenUtils
কিছু প্রাইভেট (এবং খুব কেস-নির্দিষ্ট) কোড রয়েছে এবং সহজেই ভাগ করা যায় না। এখানে এর ইন্টারফেস:
public interface TokenUtils {
String getToken(UserDetails userDetails);
String getToken(UserDetails userDetails, Long expiration);
boolean validate(String token);
UserDetails getUserFromToken(String token);
}
এটি আপনাকে একটি ভাল শুরু করতে হবে। শুভ কোডিং। :)