I started playing with Shiro security framework but soon got a little upset that it was not easy to learn how to setup a jdbcrealm. It took me some time to configure such a realm in the simplest possible way without introducing any new instances of additional objects. Warning: this solution is not safe because it stores credentials unsecured and should be used only for evaluation.
So I created a simple java code which allows to execute Shiro introductional tutorial and achieve the same result.
Solution (using Derby database)
shiro.ini (pay attention to the last line necessary to recognize permissions)
[main] jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm ds = org.apache.derby.jdbc.EmbeddedDataSource ds.user = APP ds.password = APP ds.connectionAttributes=databaseName=nameofDatabase ds.databaseName=/tmp/realm;create=true jdbcRealm.dataSource=$ds ;cacheManager=org.apache.shiro.cache.ehcache.EhCacheManager ;cacheManager.cacheManagerConfigFile=classpath:ehcache.xml ;securityManager.cacheManager=$cacheManager jdbcRealm.permissionsLookupEnabled=trueJava code
private static String[] dropSchema = { "DROP TABLE USERS", "DROP TABLE USER_ROLES", "DROP TABLE ROLES_PERMISSIONS" }; private static String[] createSchema = { "CREATE TABLE USERS (USERNAME VARCHAR(128), PASSWORD VARCHAR(128))", "CREATE TABLE USER_ROLES (USERNAME VARCHAR(128), ROLE_NAME VARCHAR(128))", "CREATE TABLE ROLES_PERMISSIONS (ROLE_NAME VARCHAR(128), PERMISSION VARCHAR(128))" }; private static String[] insertData = { "INSERT INTO USERS VALUES('root','secret')", "INSERT INTO USERS VALUES('presidentskroob','12345')", "INSERT INTO USERS VALUES('darkhelmet','ludicrousspeed')", "INSERT INTO USERS VALUES('lonestarr','vespa')", "INSERT INTO USER_ROLES VALUES('root','admin')", "INSERT INTO USER_ROLES VALUES('presidentskroob', 'president')", "INSERT INTO USER_ROLES VALUES('darkhelmet','darklord')", "INSERT INTO USER_ROLES VALUES('darkhelmet','schwartz')", "INSERT INTO USER_ROLES VALUES('lonestarr','goodguy')", "INSERT INTO USER_ROLES VALUES('lonestarr','schwartz')", "INSERT INTO ROLES_PERMISSIONS VALUES('admin','*')", "INSERT INTO ROLES_PERMISSIONS VALUES('schwartz','lightsaber:*')", "INSERT INTO ROLES_PERMISSIONS VALUES('goodguy','winnebago:drive:eagle5')" }; private static void executeSQL(Connection con, String[] sql) throws SQLException { for (String s : sql) { con.createStatement().execute(s); } } private static void executeSQLE(Connection con, String[] sql) { for (String s : sql) { try { con.createStatement().execute(s); } catch (SQLException e) { continue; } } } private static void createDB() { EmbeddedDataSource ds = new EmbeddedDataSource(); ds.setDatabaseName("/tmp/realm;create=true"); ds.setUser("APP"); ds.setPassword("APP"); Connection con = null; try { con = ds.getConnection(); executeSQLE(con, dropSchema); executeSQL(con, createSchema); executeSQL(con, insertData); con.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * @param args */ public static void main(String[] args) { createDB(); // The easiest way to create a Shiro SecurityManager with configured // realms, users, roles and permissions is to use the simple INI config. // We'll do that by using a factory that can ingest a .ini file and // return a SecurityManager instance: // Use the shiro.ini file at the root of the classpath // (file: and url: prefixes load from files and urls respectively): .................. rest of the tutorial code ..............