Eclipse Neon
Tomcat v9.0
Jdk 1.8
SpringFramework 4.0
SpringSecurity 4.0

Eclips teki dosya yapısı aşağıdaki gibidir

Spring Security 4.0 | Üye Giris Formu

Spring Security 4.0 | Üye Giris Formu

Bu makalede SpringSecurity4.0 ile basit bir üye giriş uygulaması yapacağız.

Projemizde veritabanı kullanmıyoruz.
//Controllerimiz(Home Controller)

package com.ismailfedakar.controller;

import java.security.Principal;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.bind.annotation.RequestParam;

import org.springframework.web.servlet.ModelAndView;

@Controller

public class HomeController {

//Serbest bölge

@RequestMapping(value = { "/", "/hosgeldin**" }, method = RequestMethod.GET)

public ModelAndView nerhabaSayfasi() {

ModelAndView model = new ModelAndView();

model.addObject("baslik", "SprinSecurity4.0 Üye Giriş!");

model.addObject("mesaj", "Burası Hoş geldin Sayfası!");

model.setViewName("merhaba");

return model;

}

//Yönetici girişini denetler

@RequestMapping(value = "/yonetim**", method = RequestMethod.GET)

public ModelAndView yonetimSayfasi() {

ModelAndView model = new ModelAndView();

model.addObject("baslik", "SprinSecurity4.0 Üye Giriş!");

model.addObject("mesaj", "Burası Korumalı (protected) Sayfa!");

model.setViewName("yonetim");

return model;

}

//Üye girişini denetler

@RequestMapping(value = "/giris", method = RequestMethod.GET)

public ModelAndView girisSayfasi(@RequestParam(value = "hata", required = false) String hata,

@RequestParam(value = "cikis", required = false) String cikis) {

ModelAndView model = new ModelAndView();

if (hata != null) {

model.addObject("hata", "Giriş işlemi başarısız! , Bilgilerinizi kontrol edin!");

}

if (cikis != null) {

model.addObject("msg", "Başarı ile çıkış Yaptınız.");

}

model.setViewName("giris");

return model;

}

//Yetkisiz erişimi denetler

@RequestMapping(value = "/403", method = RequestMethod.GET)

public ModelAndView yetkisizErisim(Principal user) {

ModelAndView model = new ModelAndView();

if (user != null) {

model.addObject("mesaj", " Merhaba " + user.getName()

+ ",<br> Bu sayfaya erişmek için izniniz yok!");

} else {

model.addObject("mesaj",

"Bu sayfaya erişmek için izniniz yok!");

}

model.setViewName("403");

return model;

}

}

//Configürasyon Dosyamız

package com.ismailfedakar.guvenlik;

import org.springframework.context.annotation.Configuration;

import org.springframework.security.config.annotation.web.builders.HttpSecurity;

import org.springframework.web.servlet.config.annotation.EnableWebMvc;

@Configuration

@EnableWebMvc

public class YetkiConfigurasyonu {

protected void configure(HttpSecurity http) throws Exception {

http.authorizeRequests()

.antMatchers("/yonetim/**").access("hasRole('ROLE_ADMIN')")

.and().formLogin()

.loginPage("/login").failureUrl("/login?hata")

.usernameParameter("username")

.passwordParameter("password")

.and().logout().logoutSuccessUrl("/login?cikis")

.and()

.exceptionHandling().accessDeniedPage("/403");

}

}

//yetki Kontrol Clasımız. Kullanıcının giriş yetkisi olumsuzsa 403.jsp ye yönlenecek

package com.ismailfedakar.guvenlik;

import java.io.IOException;

import java.nio.file.AccessDeniedException;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class YetkiKontrolHandler {

private String hataSayfasi;

public YetkiKontrolHandler() {

}

public YetkiKontrolHandler(String hataSayfasi) {

this.hataSayfasi = hataSayfasi;

}

public String getHataSayfasi() {

return hataSayfasi;

}

public void setHataSayfasi(String errorPage) {

this.hataSayfasi = errorPage;

}

public void hataOlursaYonlendir(HttpServletRequest request, HttpServletResponse response,

AccessDeniedException accessDeniedException)

throws IOException, ServletException {

//İlgili Hata Sayfasına yönlendirme

response.sendRedirect(hataSayfasi);

}

}

mvc-dispatcher-servlet

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"

xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:security="http://www.springframework.org/schema/security"

xmlns:tx="http://www.springframework.org/schema/tx"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd

http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd

http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-4.0.xsd

http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">

<!--Spring Konteyner Annotationları dikkate alacak-->

<context:component-scan base-package="com.ismailfedakar.controller" />

<!--Birden fazla Bean ımız olabilir-->

<context:annotation-config />

<!--Autowired Configuration RequestMapping vs. aktif-->

<tx:annotation-driven />

<!--Standart yapılandırma-->

<bean

class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<property name="prefix">

<!--Ana dizinimiz /WEB-INF/sayfalar/-->

<value>/WEB-INF/sayfalar/</value>

</property>

<property name="suffix">

<!--Sayfa uzantılarımız .jsp olacak-->

<value>.jsp</value>

</property>

</bean>

</beans>

security.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:security="http://www.springframework.org/schema/security"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd

http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-4.0.xsd">

<!--use-expressions aktif Rolleri Yapılandırabilmek için-->

<security:http auto-config="true" use-expressions="true">

<!--csrf (Güvenlik) Kontrolü aktif-->

<security:csrf/>

<!--hata oluşursa 403.jsp sayfasına yönlendir-->

<security:access-denied-handler error-page="/403" />

<!--Hosgeldin sayfası herkese açık-->

<security:intercept-url pattern="hosgeldin**" access="permitAll" />

<!--/yönetim sayfasını admin rölüne sahip olanlar görebilecek-->

<security:intercept-url pattern="/yonetim**" access="hasAnyRole('ROLE_ADMIN')" />

<!--/merhaba sayfasını admin ve user rölüne sahip olanlar görebilecek-->

<security:intercept-url pattern="/merhaba" access="hasAnyRole('ROLE_USER','ROLE_ADMIN')" />

<!--giriş.jsp sayfasındaki işlemlerini kontrol eden tag-->

<security:form-login

username-parameter="username"

password-parameter="password"

login-processing-url="/j_spring_security_check"

login-page="/giris"

default-target-url="/hosgeldin"

authentication-failure-url="/giris?hata"

/>

<!--giriş.jsp sayfasındaki logout (çıkış) işlemlerini kontrol eden tag-->

<security:logout

logout-url="/j_spring_security_logout"

invalidate-session="true"

logout-success-url="/giris?cikis" />

</security:http>

<!-- Kullanıcılar ve kullanıcı rollerini veritabanı kullanmadığımız için elle belirtiyoruz -->

<security:authentication-manager>

<security:authentication-provider>

<security:user-service>

<security:user name="ismail" password="123"

authorities="ROLE_USER" />

<security:user name="fedakar" password="123"

authorities="ROLE_ADMIN" />

</security:user-service>

</security:authentication-provider>

</security:authentication-manager>

<!-- Yetki kontrol işlemini yaptığımız YetkiKontrolHandler sınıfını Bean olarak değerlendir. Hata olursada 403 değerini hataSayfasi değişkenine aktar.

YetkiKontrolHandler sınıfıdaki hataSayfasi değişkeninin value si 403 olacak. response.sendRedirect(hataSayfasi);-->

<bean id="yetki403"

class="com.ismailfedakar.guvenlik.YetkiKontrolHandler">

<property name="hataSayfasi" value="403" />

</bean>

</beans>

web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">

<display-name>SprinSecurity4.0_UyeGirisFormu</display-name>

<welcome-file-list>

<welcome-file>merhaba.jsp</welcome-file>

</welcome-file-list>

<servlet>

<servlet-name>mvc-dispatcher</servlet-name>

<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

<load-on-startup>1</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>mvc-dispatcher</servlet-name>

<url-pattern>/</url-pattern>

</servlet-mapping>

<listener>

<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>

/WEB-INF/security.xml

</param-value>

</context-param>

<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>

</web-app>

merhaba.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<%@page session="false" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Merhaba Sayfası</title>

</head>

<body>

<center>

<div align="center">

<h1>Başlık : ${baslik}</h1>

<h1>Mesaj : ${mesaj}</h1>

</div>

</center>

</body>

</html>

giris.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Üye Giriş Sayfası</title>

</head>

<body onload='document.loginForm.username.focus();'>

<center>

<h1>SprinSecurity4.0_UyeGirisFormu</h1>

<br>

<div align="center">

<c:if test="${not empty hata}">

<div class="hata">

<h3 style="color: red;">${hata}</h3>

</div>

</c:if>

<c:if test="${not empty msg}">

<div class="msg">

<h3 style="color: red;">${msg}</h3>

</div>

<br>

</c:if>

<h3>Kullanıcı Adı ve Şifrenizi Giriniz!</h3>

<form name='loginForm'

action="<c:url value='/j_spring_security_check' />" method='POST'>

<table>

<tr>

<td>Kullanıcı Adı :</td>

<td><input type='text' name='username'></td>

</tr>

<tr>

<td>Kullanıcı Sifre:</td>

<td><input type='password' name='password' /></td>

</tr>

<tr>

<td colspan='2'><input name="submit" type="submit"

value="Giriş Yap" /></td>

</tr>

</table>

<input type="hidden" name="${_csrf.parameterName}"

value="${_csrf.token}" />

</form>

</div>

</center>

</body>

</html>

yonetim.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<%@page session="true"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Yönetici Sayfası</title>

</head>

<body>

<div align="center">

<h1>Başlık : ${baslik}</h1>

<h1>Masaj : ${mesaj}</h1>

<c:url value="/j_spring_security_logout" var="logoutUrl" />

<form action="${logoutUrl}" method="POST" id="logoutForm">

<input type="hidden" name="${_csrf.parameterName}"

value="${_csrf.token}" />

</form>

<script>

function formSubmit() {

document.getElementById("logoutForm").submit();

}

</script>

<c:if test="${pageContext.request.userPrincipal.name != null}">

<h2>

Hoşgeldin : ${pageContext.request.userPrincipal.name} | <a

href="javascript:formSubmit()"> Çıkış Yap</a>

</h2>

</c:if>

</div>

</body>

</html>

403.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<%@page session="false"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>HATA!</title>

</head>

<body onload="setTimeout('bekleBiraz()',3000)">

<center>

<div align="center" style="width: 500px">

<h1 style="background:lime; color: red;">Yetkisiz Giriş!</h1>

<h2><span style="color: red;">Hata</span><br>${mesaj }</h2>

</div>

</center>

<script type="text/javascript">

function bekleBiraz()

{

window.location = "http://localhost:8081/SprinSecurity4.0_UyeGirisFormu/giris"

}

</script>

<br>

<center>

<h2 style="color: red;">Yönlendiriliyorsunuz!</h2>

<p>3 saniye içerisinde giriş sayfasına yönlendirileceksiniz!</p>

</center>

</body>

</html>

pom.xml

<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.ismailfedakar</groupId>

<artifactId>SprinSecurity4.0_UyeGirisFormu</artifactId>

<version>0.0.1-SNAPSHOT</version>

<packaging>war</packaging>

<dependencies>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-aop</artifactId>

<version>4.0.0.RELEASE</version>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-beans</artifactId>

<version>4.0.0.RELEASE</version>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-context</artifactId>

<version>4.0.0.RELEASE</version>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-core</artifactId>

<version>4.0.0.RELEASE</version>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-tx</artifactId>

<version>4.0.0.RELEASE</version>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-web</artifactId>

<version>4.0.0.RELEASE</version>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-webmvc</artifactId>

<version>4.0.0.RELEASE</version>

</dependency>

<dependency>

<groupId>org.springframework.security</groupId>

<artifactId>spring-security-core</artifactId>

<version>4.0.0.RELEASE</version>

</dependency>

<dependency>

<groupId>org.springframework.security</groupId>

<artifactId>spring-security-config</artifactId>

<version>4.0.0.RELEASE</version>

</dependency>

<dependency>

<groupId>jstl</groupId>

<artifactId>jstl</artifactId>

<version>1.2</version>

</dependency>

<dependency>

<groupId>javax.servlet</groupId>

<artifactId>javax.servlet-api</artifactId>

<version>3.1.0</version>

<scope>provided</scope>

</dependency>

<dependency>

<groupId>javax.servlet.jsp</groupId>

<artifactId>jsp-api</artifactId>

<version>2.2</version>

</dependency>

<dependency>

<groupId>org.springframework.security</groupId>

<artifactId>spring-security-web</artifactId>

<version>4.0.1.RELEASE</version>

</dependency>

</dependencies>

<properties>

<org.springframework>4.0.0.RELEASE</org.springframework>

<org.springframework.security>4.0.0.RELEASE</org.springframework.security>

</properties>

<name>SprinSecurity4.0_UyeGirisFormu</name>

<url>http://www.ismailfedakar.com/</url>

</project>

Projeyi çalıştıdığımızda görüntümüz aşağıdaki gibi olacak.

Spring Security 4.0 | Üye Giris Formu

Spring Security 4.0 | Üye Giris Formu

Tarayıcıdaki linki şu şekilde değiştirelim

http://localhost:8080/SprinSecurity4.0_UyeGirisFormu/giris

Karşımıza şu ekran gelecek

Spring Security 4.0 | Üye Giris Formu

Spring Security 4.0 | Üye Giris Formu

ROLE_USER yetkisine sahip olan k.adı=ismail şifre=123 ile giriş yapalım.

Aşağıdaki görüntü gelecek

Spring Security 4.0 | Üye Giris Formu

Spring Security 4.0 | Üye Giris Formu

Hoşgeldin etiketi securit.xml de dikkat ederseniz access=“permitAll” olarak tanımlanmıştır. Yani buraya ROLE_USER ve ROLE_ADMIN yetkisine sahip tüm kullanıcılar ulaşabilmektedir. Sıkıntı Yok. Şimdi linkimizi şu şekilde değiştirelim. http://localhost:8080/SprinSecurity4.0_UyeGirisFormu/yonetim

Karşımıza şöyle bir görüntü gelecek.

Spring Security 4.0 | Üye Giris Formu

Spring Security 4.0 | Üye Giris Formu

Javascript BirazBekle();

metodu ile giriş.jsp ye yönlendirme yapıyoruz. Çünkü kullanıcı ROLE_USER yetkisine sahip

Sonraki ekran görüntüsü

Spring Security 4.0 | Üye Giris Formu

Spring Security 4.0 | Üye Giris Formu

Şimdide ROLE_ADMIN yetkisine sahip k.adı=fedakar şifresi=123 olan admin yetkisine sahip kullanıcı ile giriş yapalım. Ekran görüntümüz aşağıdaki gibi olacak

Şimdi tekrar Linkimizi şu şekilde yapalım

http://localhost:8080/SprinSecurity4.0_UyeGirisFormu/yonetim

Görüntümüz aşağıdaki gibi olacak

Spring Security 4.0 | Üye Giris Formu

Spring Security 4.0 | Üye Giris Formu

Çıkış Yap butonuna tıklarsanız tekrar giriş sayfasına yönlenirsiniz.Bu günlükte bu kadar.
Github Source Code

Benzer İçerikler

JSF EĞİTİM SETİ

WordPress

Blogger

SpringSecurity4.0 ile basit bir üye giriş uygulamasını nasıl yapabileceğimizi inceledik.

Aslında Asp.Net ne yada Asp.Net Mvc deki Authorization uygulama yapısına benzemekte.

Ben kendi şahsıma web sitesinin Authorization mekanızmasını kendim geliştirmeyi düşünürüm ama mademki spring konteyner bize böyle hazır bir güvenlik mekanızması sunmuş bazı projelerimizde bu yapıdan yaralanmakta mümkündür. Spring securiry mekanizmasını kullanmak mecburi değil opsiyoneldir. İsterseniz kendi güvenlik mekanizmanızı kendiniz oluşturabilir yada ikisini karışık olarakta kullanabilirsiniz.

Bir dahaki makalede veritabanı kullanarak aynı uygulamanın farklı bir versiyonunu incelemeye çalışacağım.

Umarım fayadalı olmuştur. Kalın sağlıcakla.

Soysal Medyada Paylaş