Categories: spring-security

Spring Security 4 Role Based Login Example

This tutorial explores Spring Security’s role based login. That means redirecting users to different URLs upon login according to their assigned roles. Let’s get going.

Basically what we have to do is to create a custom Success-Handler which will be responsible for redirecting the logged-in user to appropriate URL based on his/her role. Spring Security already provides SimpleUrlAuthenticationSuccessHandler which contains the generic logic for success handler. We will just extend this with our own redirect logic to achieve our goal.

Once we got this success handler, we will register it with formLogin() or loginPage() et voila. Complete example is shown below.


Following technologies being used:

  • Spring 4.1.6.RELEASE
  • Spring Security 4.0.1.RELEASE
  • Maven 3
  • JDK 1.7
  • Tomcat 8.0.21
  • Eclipse JUNO Service Release 2

Let’s begin.

Step 1: Project directory structure

Following will be the final project structure:

Let’s now add the content mentioned in above structure explaining each in detail.

Step 2: Update pom.xml to include required dependencies

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.websystique.springsecurity</groupId>
  <artifactId>SpringSecurityRoleBasedLoginExample</artifactId>
  <version>1.0.0</version>
  <packaging>war</packaging>

  <name>SpringSecurityRoleBasedLoginExample</name>

 <properties>
  <springframework.version>4.1.6.RELEASE</springframework.version>
  <springsecurity.version>4.0.1.RELEASE</springsecurity.version>
 </properties>

 <dependencies>
  <!-- Spring -->
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-core</artifactId>
   <version>${springframework.version}</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-web</artifactId>
   <version>${springframework.version}</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-webmvc</artifactId>
   <version>${springframework.version}</version>
  </dependency>

  <!-- Spring Security -->
  <dependency>
   <groupId>org.springframework.security</groupId>
   <artifactId>spring-security-web</artifactId>
   <version>${springsecurity.version}</version>
  </dependency>
  <dependency>
   <groupId>org.springframework.security</groupId>
   <artifactId>spring-security-config</artifactId>
   <version>${springsecurity.version}</version>
  </dependency>

  <dependency>
   <groupId>javax.servlet</groupId>
   <artifactId>javax.servlet-api</artifactId>
   <version>3.1.0</version>
  </dependency>
  <dependency>
   <groupId>javax.servlet.jsp</groupId>
   <artifactId>javax.servlet.jsp-api</artifactId>
   <version>2.3.1</version>
  </dependency>
  <dependency>
   <groupId>javax.servlet</groupId>
   <artifactId>jstl</artifactId>
   <version>1.2</version>
  </dependency>
 </dependencies>

 <build>
  <pluginManagement>
   <plugins>
    <plugin>
     <groupId>org.apache.maven.plugins</groupId>
     <artifactId>maven-compiler-plugin</artifactId>
     <version>3.2</version>
     <configuration>
      <source>1.7</source>
      <target>1.7</target>
     </configuration>
    </plugin>
    <plugin>
     <groupId>org.apache.maven.plugins</groupId>
     <artifactId>maven-war-plugin</artifactId>
     <version>2.4</version>
     <configuration>
      <warSourceDirectory>src/main/webapp</warSourceDirectory>
      <warName>SpringSecurityRoleBasedLoginExample</warName>
      <failOnMissingWebXml>false</failOnMissingWebXml>
     </configuration>
    </plugin>
   </plugins>
  </pluginManagement>
  <finalName>SpringSecurityRoleBasedLoginExample</finalName>
 </build>
</project>

Step 3: Add Spring Security Configuration Class

The first and foremost step to add spring security in our application is to create Spring Security Java Configuration. This configuration creates a Servlet Filter known as the springSecurityFilterChain which is responsible for all the security (protecting the application URLs, validating submitted username and passwords, redirecting to the log in form, etc) within our application.

package com.websystique.springsecurity.configuration;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

 @Autowired
 CustomSuccessHandler customSuccessHandler;

 @Autowired
 public void configureGlobalSecurity(AuthenticationManagerBuilder auth) throws Exception {
  auth.inMemoryAuthentication().withUser("bill").password("abc123").roles("USER");
  auth.inMemoryAuthentication().withUser("admin").password("root123").roles("ADMIN");
  auth.inMemoryAuthentication().withUser("dba").password("root123").roles("ADMIN","DBA");
 }

 @Override
 protected void configure(HttpSecurity http) throws Exception {
   http.authorizeRequests()
    .antMatchers("/", "/home").access("hasRole('USER')")
    .antMatchers("/admin/**").access("hasRole('ADMIN')")
    .antMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')")
    .and().formLogin().loginPage("/login").successHandler(customSuccessHandler)
    .usernameParameter("ssoId").passwordParameter("password")
    .and().csrf()
    .and().exceptionHandling().accessDeniedPage("/Access_Denied");
 }

}

This class is similar to previous posts except one major difference:
formLogin().loginPage("/login").successHandler(customSuccessHandler). Look at successHandler. This is the class [shown below] responsible for eventual redirection based on any custom logic, which in our case will be to redirect the user [to home/admin/db ] based on his role [USER/ADMIN/DBA].

Above security configuration in XML configuration format would be:

<beans:beans xmlns="http://www.springframework.org/schema/security"
    xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
    http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-4.0.xsd">
     
    <http auto-config="true" >
        <intercept-url pattern="/" access="hasRole('USER')" />
        <intercept-url pattern="/home" access="hasRole('USER')" />
        <intercept-url pattern="/admin**" access="hasRole('ADMIN')" />
        <intercept-url pattern="/dba**" access="hasRole('ADMIN') and hasRole('DBA')" />
        <form-login  login-page="/login" 
                     username-parameter="ssoId" 
                     password-parameter="password" 
                     authentication-success-handler-ref="customSuccessHandler"
                     authentication-failure-url="/Access_Denied" />
        <csrf/>
    </http>
 
    <authentication-manager >
        <authentication-provider>
            <user-service>
                <user name="bill"  password="abc123"  authorities="ROLE_USER" />
                <user name="admin" password="root123" authorities="ROLE_ADMIN" />
                <user name="dba"   password="root123" authorities="ROLE_ADMIN,ROLE_DBA" />
            </user-service>
        </authentication-provider>
    </authentication-manager>
     
    <beans:bean id="customSuccessHandler" class="com.websystique.springsecurity.configuration.CustomSuccessHandler" />
    
</beans:beans>

Below is the Success-Handler referred in above class

package com.websystique.springsecurity.configuration;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.web.DefaultRedirectStrategy;
import org.springframework.security.web.RedirectStrategy;
import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler;
import org.springframework.stereotype.Component;

@Component
public class CustomSuccessHandler extends SimpleUrlAuthenticationSuccessHandler {

 private RedirectStrategy redirectStrategy = new DefaultRedirectStrategy();

 @Override
 protected void handle(HttpServletRequest request, HttpServletResponse response, Authentication authentication)
   throws IOException {
  String targetUrl = determineTargetUrl(authentication);

  if (response.isCommitted()) {
   System.out.println("Can't redirect");
   return;
  }

  redirectStrategy.sendRedirect(request, response, targetUrl);
 }

 /*
  * This method extracts the roles of currently logged-in user and returns
  * appropriate URL according to his/her role.
  */ protected String determineTargetUrl(Authentication authentication) {
  String url = "";

  Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();

  List<String> roles = new ArrayList<String>();

  for (GrantedAuthority a : authorities) {
   roles.add(a.getAuthority());
  }

  if (isDba(roles)) {
   url = "/db";
  } else if (isAdmin(roles)) {
   url = "/admin";
  } else if (isUser(roles)) {
   url = "/home";
  } else {
   url = "/accessDenied";
  }

  return url;
 }

 private boolean isUser(List<String> roles) {
  if (roles.contains("ROLE_USER")) {
   return true;
  }
  return false;
 }

 private boolean isAdmin(List<String> roles) {
  if (roles.contains("ROLE_ADMIN")) {
   return true;
  }
  return false;
 }

 private boolean isDba(List<String> roles) {
  if (roles.contains("ROLE_DBA")) {
   return true;
  }
  return false;
 }

 public void setRedirectStrategy(RedirectStrategy redirectStrategy) {
  this.redirectStrategy = redirectStrategy;
 }

 protected RedirectStrategy getRedirectStrategy() {
  return redirectStrategy;
 }

}

Notice how we are extending Spring SimpleUrlAuthenticationSuccessHandler class and overriding handle() method which simply invokes a redirect using configured RedirectStrategy [default in this case] with the URL returned by the user defined determineTargetUrl method. This method extracts the Roles of currently logged in user from Authentication object and then construct appropriate URL based on there roles. Finally RedirectStrategy , which is responsible for all redirections within Spring Security framework , redirects the request to specified URL.

REST OF THE STEPS ARE SAME AS PREVIOUS POST

Step 4: Register the springSecurityFilter with war

Below specified initializer class registes the springSecurityFilter [created in Step 3] with application war.

package com.websystique.springsecurity.configuration;

import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer;

public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer {

}

Above setup in XML configuration format would be:

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Step 5: Add Controller

package com.websystique.springsecurity.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class HelloWorldController {

 
 @RequestMapping(value = { "/", "/home" }, method = RequestMethod.GET)
 public String homePage(ModelMap model) {
  model.addAttribute("user", getPrincipal());
  return "welcome";
 }

 @RequestMapping(value = "/admin", method = RequestMethod.GET)
 public String adminPage(ModelMap model) {
  model.addAttribute("user", getPrincipal());
  return "admin";
 }
 
 @RequestMapping(value = "/db", method = RequestMethod.GET)
 public String dbaPage(ModelMap model) {
  model.addAttribute("user", getPrincipal());
  return "dba";
 }

 @RequestMapping(value = "/Access_Denied", method = RequestMethod.GET)
 public String accessDeniedPage(ModelMap model) {
  model.addAttribute("user", getPrincipal());
  return "accessDenied";
 }

 @RequestMapping(value = "/login", method = RequestMethod.GET)
 public String loginPage() {
  return "login";
 }

 @RequestMapping(value="/logout", method = RequestMethod.GET)
 public String logoutPage (HttpServletRequest request, HttpServletResponse response) {
  Authentication auth = SecurityContextHolder.getContext().getAuthentication();
  if (auth != null){    
   new SecurityContextLogoutHandler().logout(request, response, auth);
  }
  return "redirect:/login?logout";
 }

 private String getPrincipal(){
  String userName = null;
  Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();

  if (principal instanceof UserDetails) {
   userName = ((UserDetails)principal).getUsername();
  } else {
   userName = principal.toString();
  }
  return userName;
 }

}

Step 6: Add SpringMVC Configuration Class

package com.websystique.springsecurity.configuration;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.JstlView;

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.websystique.springsecurity")
public class HelloWorldConfiguration extends WebMvcConfigurerAdapter{
 
 @Bean
 public ViewResolver viewResolver() {
  InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
  viewResolver.setViewClass(JstlView.class);
  viewResolver.setPrefix("/WEB-INF/views/");
  viewResolver.setSuffix(".jsp");

  return viewResolver;
 }

     /*
     * Configure ResourceHandlers to serve static resources like CSS/ Javascript etc...
     */    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**").addResourceLocations("/static/");
    }
}

Step 7: Add Initializer class

package com.websystique.springsecurity.configuration;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class SpringMvcInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

 @Override
 protected Class<?>[] getRootConfigClasses() {
  return new Class[] { HelloWorldConfiguration.class };
 }
 
 @Override
 protected Class<?>[] getServletConfigClasses() {
  return null;
 }
 
 @Override
 protected String[] getServletMappings() {
  return new String[] { "/" };
 }

}

Step 8: Add Views

login.jsp
This view additionally contains CSS for login panel layout.

&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=ISO-8859-1&quot; pageEncoding=&quot;ISO-8859-1&quot;%&gt;
&lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot;%&gt;
&lt;html&gt;
 &lt;head&gt;
  &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=ISO-8859-1&quot;&gt;
  &lt;title&gt;Login page&lt;/title&gt;
  &lt;link href=&quot;&lt;c:url value='/static/css/bootstrap.css' /&gt;&quot;  rel=&quot;stylesheet&quot;&gt;&lt;/link&gt;
  &lt;link href=&quot;&lt;c:url value='/static/css/app.css' /&gt;&quot; rel=&quot;stylesheet&quot;&gt;&lt;/link&gt;
  &lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.2.0/css/font-awesome.css&quot; /&gt;
 &lt;/head&gt;

 &lt;body&gt;
  &lt;div id=&quot;mainWrapper&quot;&gt;
   &lt;div class=&quot;login-container&quot;&gt;
    &lt;div class=&quot;login-card&quot;&gt;
     &lt;div class=&quot;login-form&quot;&gt;
      &lt;c:url var=&quot;loginUrl&quot; value=&quot;/login&quot; /&gt;
      &lt;form action=&quot;${loginUrl}&quot; method=&quot;post&quot; class=&quot;form-horizontal&quot;&gt;
       &lt;c:if test=&quot;${param.error != null}&quot;&gt;
        &lt;div class=&quot;alert alert-danger&quot;&gt;
         &lt;p&gt;Invalid username and password.&lt;/p&gt;
        &lt;/div&gt;
       &lt;/c:if&gt;
       &lt;c:if test=&quot;${param.logout != null}&quot;&gt;
        &lt;div class=&quot;alert alert-success&quot;&gt;
         &lt;p&gt;You have been logged out successfully.&lt;/p&gt;
        &lt;/div&gt;
       &lt;/c:if&gt;
       &lt;div class=&quot;input-group input-sm&quot;&gt;
        &lt;label class=&quot;input-group-addon&quot; >CSRF attacks</a>. As you can see, the CSRF parameters are accessed using EL expressions in your JSP, you may additionally prefer to force EL expressions to be evaluated, by adding following to the top of your JSP:

&lt;%@ page isELIgnored=&quot;false&quot;%&gt;

welcome.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 <title>Welcome page</title>
</head>
<body>
 Dear <strong>${user}</strong>, Welcome to Home Page.
 <a href="<c:url value="/logout" />">Logout</a>
</body>
</html>

admin.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 <title>Admin page</title>
</head>
<body>
 Dear <strong>${user}</strong>, Welcome to Admin Page.
 <a href="<c:url value="/logout" />">Logout</a>
</body>
</html>

dba.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 <title>DBA page</title>
</head>
<body>
 Dear <strong>${user}</strong>, Welcome to DBA Page.
 <a href="<c:url value="/logout" />">Logout</a>
</body>
</html>

accessDenied.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 <title>AccessDenied page</title>
</head>
<body>
 Dear <strong>${user}</strong>, You are not authorized to access this page
 <a href="<c:url value="/logout" />">Logout</a>
</body>
</html>

In case you need it, here is the quick & dirty CSS i used for this example:
app.css

html{
 background-color:#2F2F2F;
}

body, #mainWrapper {
 height: 100%;
 background-image: -webkit-gradient(
 linear,
 right bottom,
 right top,
 color-stop(0, #EDEDED),
 color-stop(0.08, #EAEAEA),
 color-stop(1, #2F2F2F),
 color-stop(1, #AAAAAA)
);
background-image: -o-linear-gradient(top, #EDEDED 0%, #EAEAEA 8%, #2F2F2F 100%, #AAAAAA 100%);
background-image: -moz-linear-gradient(top, #EDEDED 0%, #EAEAEA 8%, #2F2F2F 100%, #AAAAAA 100%);
background-image: -webkit-linear-gradient(top, #EDEDED 0%, #EAEAEA 8%, #2F2F2F 100%, #AAAAAA 100%);
background-image: -ms-linear-gradient(top, #EDEDED 0%, #EAEAEA 8%, #2F2F2F 100%, #AAAAAA 100%);
background-image: linear-gradient(to top, #EDEDED 0%, #EAEAEA 8%, #2F2F2F 100%, #AAAAAA 100%);
}

body, #mainWrapper, .form-control{
 font-size:12px;
}

#mainWrapper {
 height: 100vh; 
 padding-left:10px;
 padding-right:10px;
 padding-bottom:10px;
}

#authHeaderWrapper{
 clear:both;
 width: 100%;
 height:3%;
 padding-top:5px;
 padding-bottom:5px;
}

.login-container {
    margin-top: 100px;
    background-color: floralwhite;
    width: 40%;
    left: 30%;
    position: absolute;
}

.login-card {
    width: 80%;
    margin: auto;
}
.login-form {
    padding: 10%;
}

Step 9: Build and Deploy the application

Now build the war (either by eclipse/m2eclipse) or via maven command line( mvn clean install). Deploy the war to a Servlet 3.0 container . Since here i am using Tomcat, i will simply put this war file into tomcat webapps folder and click on start.bat inside tomcat bin directory.

Run the application
Open browser and goto localhost:8080/SpringSecurityRoleBasedLoginExample/, you will be prompted for login

Provide credentials of DBA

submit, you will be taken directly to /db page as the logged-in user has DBA role. ROLE-BASED-LOGIN

Now logout, and fill-in credentials of a USER role.

Provide wrong password & submit.

Provide correct USER role credentials, you will be redirected to home page.

Now try to access admin page.You should see AccessDenied page.

Now logout and login with ADMIN credentials, you will be taken to /admin URL.

That’s it. Next post shows you Spring Security database authentication using Hibernate annotation based approach.

Download Source Code


References

View Comments

  • "The Mystery of Nils" is a thrilling adventure novel that will keep you on the edge of your seat. The story follows the journey of a young boy named Nils as he sets out to solve a perplexing mystery. With the help of his trusted friends, Nils embarks on a dangerous quest that takes him through treacherous terrain and dark, mysterious forests. Along the way, he encounters strange characters and uncovers clues that lead him closer to unraveling the mystery. As the stakes get higher and the danger increases, Nils must use all his wit and cunning to stay one step ahead of his enemies. Will he be able to solve the mystery before it's too late? Read "The Mystery of Nils" to find out.

  • If you're interested in TikTok Insiders, then you need to understand the algorithm and how it works. The For You Page is where most content goes viral and it's important to create content that appeals to your target audience. Hashtags are important, but don't overdo it. Use relevant hashtags that are popular and unique to your content. Collaborating with other creators can also increase your reach and gain more followers. Consistency is key, post regularly and engage with your audience. Lastly, keep up with the latest TikTok trends and be creative with your content.

  • Looking to boost your e-commerce profits? Look no further than eCom Profit Sniper. This powerful program is designed to help you increase your online sales and maximize your revenue. With its innovative tools and expert guidance, eCom Profit Sniper can help you identify the most profitable products, optimize your website for conversions, and create effective marketing campaigns that drive traffic and sales. Whether you're a seasoned e-commerce pro or just starting out, eCom Profit Sniper can help you take your business to the next level. So why wait? Sign up today and start seeing results in no time!and see the results for yourself!

  • "The Mystery of Nils" is a thrilling adventure novel that will keep you on the edge of your seat. The story follows the journey of a young boy named Nils as he sets out to solve a perplexing mystery. With the help of his trusted friends, Nils embarks on a dangerous quest that takes him through treacherous terrain and dark, mysterious forests. Along the way, he encounters strange characters and uncovers clues that lead him closer to unraveling the mystery. As the stakes get higher and the danger increases, Nils must use all his wit and cunning to stay one step ahead of his enemies. Will he be able to solve the mystery before it's too late? Read "The Mystery of Nils

  • Canlı Casino Siteleri en büyük sorunlarından biri, en güvenilir casino sitelerini bulmaktır. Oyunlarınızı hangi sitelerde oynayacağınızı, nasıl bir strateji izleyeceğinizi, en iyi bonus avantajlarının hangi sitelerde olduğunu, casino sitelerine güvenli bir şekilde para yatırma ve çekme yöntemlerini öğrenmek için öncelikle güvenilir casino sitelerini bulmanız gerekmektedir.

  • Fluxactive Complete is a powerful fitness supplement that provides energy, endurance, and strength to athletes and fitness enthusiasts. Made with natural ingredients, Fluxactive Complete is a safe and effective way to enhance your workouts and get the most out of your training. With caffeine, beta-alanine, and creatine as key ingredients, this supplement helps to boost your metabolism, improve your focus, and increase your muscle mass. Whether you're a professional athlete or just starting out on your fitness journey, Fluxactive Complete can help you achieve your goals and reach your full potential. So why wait? Try Fluxactive Complete today and take your fitness to the next level!

  • Fluxactive Complete is a powerful fitness supplement that provides energy, endurance, and strength to athletes and fitness enthusiasts. Made with natural ingredients, Fluxactive Complete is a safe and effective way to enhance your workouts and get the most out of your training. With caffeine, beta-alanine, and creatine as key ingredients, this supplement helps to boost your metabolism, improve your focus, and increase your muscle mass. Whether you're a professional athlete or just starting out on your fitness journey, Fluxactive Complete can help you achieve your goals

  • Gluconite is a natural supplement that helps regulate blood sugar levels. With herbal ingredients such as cinnamon bark, hibiscus, passionflower, and chamomile, Gluconite works to stabilize blood sugar levels while promoting healthy sleep patterns. This supplement is perfect for those who struggle with diabetes or high blood sugar levels. Gluconite's organic formula is also great for individuals who want to maintain a healthy lifestyle. By regulating blood sugar levels, Gluconite also helps to boost metabolism and reduce the risk of heart disease and stroke. With consistent use, Gluconite can help individuals achieve a healthier and more balanced lifestyle.

  • Gluconite is a natural supplement that helps regulate blood sugar levels. With herbal ingredients such as cinnamon bark, hibiscus, passionflower, and chamomile, Gluconite works to stabilize blood sugar levels while promoting healthy sleep patterns. This supplement is perfect for those who struggle with diabetes or high blood sugar levels. Gluconite's organic formula is also great for individuals who want to maintain a healthy lifestyle. By regulating blood sugar levels, Gluconite also helps to boost metabolism and reduce the risk of heart disease and stroke. With consistent use, Gluconite can help individuals achieve a healthier and more balanced lifestyle.fficient transactions.

  • With the Million Dollar Replicator, you can now replicate your way to riches. This system allows you to create a passive income stream that will generate profits for you 24/7. Using cutting-edge technology and proven marketing techniques, the Million Dollar Replicator is designed to help you succeed in the competitive world of online business. Unlike other systems that promise the world but deliver nothing, this one is the real deal. You'll be amazed at how easy it is to use and how quickly you can start making money. Don't wait any longer to start your journey to financial freedom. Sign up for the Million Dollar Replicator today and start living the life you've always dreamed of.

Share
Published by

Recent Posts

Spring Boot + AngularJS + Spring Data + JPA CRUD App Example

In this post we will be developing a full-blown CRUD application using Spring Boot, AngularJS, Spring Data, JPA/Hibernate and MySQL,…

8 years ago

Spring Boot Rest API Example

Spring Boot complements Spring REST support by providing default dependencies/converters out of the box. Writing RESTful services in Spring Boot…

8 years ago

Spring Boot WAR deployment example

Being able to start the application as standalone jar is great, but sometimes it might not be possible to run…

8 years ago

Spring Boot Introduction + hello world example

Spring framework has taken the software development industry by storm. Dependency Injection, rock solid MVC framework, Transaction management, messaging support,…

8 years ago

Secure Spring REST API using OAuth2

Let's secure our Spring REST API using OAuth2 this time, a simple guide showing what is required to secure a…

8 years ago

AngularJS+Spring Security using Basic Authentication

This post shows how an AngularJS application can consume a REST API which is secured with Basic authentication using Spring…

8 years ago