Apache Shiro, kullanımı son derece kolay bir security framework'udur. Ben, burada basit olarak shiro'nun nasıl kullanılacağından bahsetmek istiyorum.

Frameworku kullanmak için öncelikle JDK 1.5 veya üstü gerekiyor.Ayrıca, gerekli olan jar dosyaları apache shiro'nun kendi sitesinden edinilebilinir. Shiro'yu nasıl kullanacağımıza geçmek gerekirse, öncelikle, bize .ini uzantılı bir dosya gerekiyor. Ayarlarımızı bu dosya üzerinden yapacağız. 

	#######Shiro.ini########
​    [main]

    jdbcRealm = org.apache.shiro.realm.jdbc.JdbcRealm
    ds = com.mysql.jdbc.jdbc2.optional.MysqlDataSource
    ds.serverName = ******
    ds.user = ******
    ds.password = *****
    ds.databaseName = *****
    jdbcRealm.dataSource = $ds
    
	[users]
	[roles]
	[urls]

Neredeyse bütün örneklerde olduğu gibi geleneği bozmayalım ve bu ini dosyamızın adı da shiro.ini olsun. Öncelikle, jdbcRealm'i shiroya tanıttık. Daha sonra mysql için gerekli kütüphaneyi main'in içine ekledik ve onu da jsbcRealm'ın data source'na ekledik. Artık, mysql database'ine bağlanmamızda bir engel kalmadı. Peki, mysqle bağlandık ama nasıl kullanacağız? Çok basit. Shiro'yu kullanabilmek için en sadesinden user, role ve permission tabloları gerek. Onları da oluşturalım.

CREATE TABLE user (
username VARCHAR(1024),
password VARCHAR(1024)
)
CREATE TABLE role(
role_name VARCHAR(1024),
user_name VARCHAR(1024)
)
CREATE TABLE permission(
permission_name VARCHAR(1024),
role_name VARCHAR(1024)
)

Tablolarımızı da oluşturduk. Sıra geldi tablolarımızla shiro arasındaki bağlantıyı sağlamaya.

jdbcRealm.authenticationQuery = SELECT password FROM user WHERE username = ?
jdbcRealm.userRolesQuery = SELECT role_name FROM role WHERE username = ?
jdbcRealm.permissionsQuery = SELECT permission_name FROM permission WHERE role_name = ?

Burayı, shiro.ini dosyasında [main]'in içinde en alta ekliyoruz. Artık, java kısmına geçebiliriz.

shiro.ini 'yi java'da tanıtalım.

Factory factory = new IniSecurityManagerFactory("classpath:shiro.ini");
SecurityManager securityManager = factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);

Shiro, user objesi kulanmaz. Onun yerine subject kullanır. Subjecti user gibi düşünebiliriz. 

Subject usr = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(username,password);
usr.login(token);

Eğer, başarılı bir şekilde login olduysak, usr objemize, roller ve rollere bağlı olarak permissionlar implement edilecektir. Yoksa, AuthenticationException yakalayacağız. Artık, istediğimiz gibi mekanizmayı kullanabiliriz.

if(usr.isAuthenticated()){   
    if(usr.hasRole("admin")){     // jdbcRealm.userRolesQuery kullanılır.
        if(usr.isPermitted("read")){  //rollere bağlı olarak jdbcRealm.permissionsQuery kullanılır.
            System.out.println("I'm admin and I can read.");
        }
    }
}


Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.