Zobrazují se příspěvky se štítkemjava. Zobrazit všechny příspěvky
Zobrazují se příspěvky se štítkemjava. Zobrazit všechny příspěvky

středa 25. listopadu 2020

JAVA - Version number may be negative or greater than 255

Při spuštění jednoho staršího JAVA programu na mě vyskočila tato hláška: Invalid version number: Version number may be negative or greater than 255

Po drobném zkoumání jsem zjistil, že nikdo pravděpodobně nepředpokládal, že minor verze JAVA se někdy dostane přes 255 a došlo ke krásnému přetečení :)

Řešení? To nejrychlejší je spustit to se starší JAVA verzí.

pondělí 1. ledna 2018

How to use SSO with your JAVA application?

Some weeks ago I've recieved an interesting task - use passwordless access to the database. I have to use the Kerberos ticket from LSA cache and pass it to the database on Windows 7. It looks easy, or...?

You have to run regedit and add following key to your registry:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa\Kerberos\Parameters
Value Name: allowtgtsessionkey
Value Type: REG_DWORD
Value: 0x01
Then you have to create jaas config (jaas.cfg) file with following content:

    com.sun.security.jgss.krb5.initiate {
        com.sun.security.auth.module.Krb5LoginModule
        required
        useTicketCache=true
        doNotPrompt=false
    };

Where to put this config?

  • The JRE looks for a default jaas.conf in “file:${user.home}/.java.login.config”
  • You can add configuration files to java.security located in “lib/security” in the JRE base directory like so: “login.config.url.1=file:C:/somewhere/.java.login.config”
  • Or you can specify the jaas configuration on the command line with: 
    • “-Djava.security.auth.login.config=path_to_file”

Then you have to do one very important thing - you have to run your application as a local admin. Without this condition it is definitely not working. If you have another experience with SSO / JAVA on Windows, let me know in the discussion below. And of course, you have to change the JDBC connection string to be "Kerberos ready". For example for Teradata it is LOGMECH=KRB5.

P.S. Very nice documentation is here: http://cr.openjdk.java.net/~weijun/special/krb5winguide-2/raw_files/new/kwin



středa 3. srpna 2011

Spring-security a RichFaces

Do naší malé aplikace jsem dostal za úkol naimplementovat správu uživatelských práv a rolí. Z logiky použitých technologií jsme došli k balíčku spring-security. Má mnoho možností, snadnou konfiguraci a hlavně používáme spring, tak se to jeví jako logická volba. Při implementaci jsem narazil na super bug, který mi sebral asi 4 hodiny života.

V pom.xml jsem nadefinoval závislost na spring-security, Eclipse chvíli chroupala, stáhla knihovny a mohl jsem začít postupovat dle návodu. Návod si můžete nalézt zde: http://static.springsource.org/spring-security/site/tutorial.html

Nejprve jsem do web.xml doplnil nezbytný kód. Nebudu ho sem kopírovat, je to zbytečné zabírání místa.

Následovalo vytvoření souboru security-app-context.xml:

<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-3.0.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.1.xsd"
>

<http use-expressions="true">
<intercept-url pattern="/index.xhtml" access="permitAll" />
<intercept-url pattern="/**" access="isAuthenticated()" />
<form-login />
</http>

<authentication-manager>
<authentication-provider>
<user-service>
<user name="rod" password="koala" authorities="supervisor, teller, user" />
</user-service>
</authentication-provider>
</authentication-manager>
</beans:beans>


Všechny stránky mimo index.xhtml, pokud nebude uživatel přihlášen, nebudou zobrazeny.



Pak je nutné doplnit web.xml načtením této konfigurace:



<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/security-app-context.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>


Spring-security se tak nahraje při startu aplikace a bude prohlížet všechny požadavky a ty filtrovat dle pravidel.



No a teď jsem chtěl předělat přihlašovací okno, aby se uživatelé hlásili přes spring-security.



Návody hovoří o tom, že stačí poslat pole j_username a j_password stránce j_spring_security_check a dál se vše vyřeší samo. V konfiguračním souboru security-app-context.xml se pak v tagu <form-login> dá nastavit, jak se má po loginu a logoutu aplikace chovat – přesměrování po úspěšném-neúspěšném přihlášení atd.



Nojo, ale ono to nefungovalo !



Zapnuj sem logování přes log4j, ale z hlášek jsem pochopil jediné, spring-security vůbec netuší, pod jakým uživatelem se hlásím. Trvalo mi docela dlouho, než jsem přišel na příčinu – RichFaces si přegenerovává názvy polí a tak, když se mé pole jmenuje j_username a je ve formuláři form, je přejmenováno na form:username. No a spring to nemá rád. Ve verzi 3.1 již je toto vyřešeno – lze definovat, jaké jsou přihlašovací pole, ale starší verze je nutné ofixovat jinak.



Řešení? Nahradil jsem RichFaces <h:inputtext> klasickým <input type=”text”>. Najednou vše funguje, jak má…


pátek 29. července 2011

Dynamické dropDownMenu v RichFaces

V práci jsem se na projektu dostal k vytváření webového GUI. Zkoušíme použít RichFaces a hned na úvod jsem narazil na několik problémů, které bych chtěl postupně popsat. Nyní tedy k dynamickému rich:dropDownMenu.
DropDownMenu je pěkná komponenta, která umožňuje víceúrovňové vnořování, obrázky u odkazů a mnoho dalšího. Chtěl jsem toto menu, resp. jeho položky generovat automaticky, protože chceme mít v aplikaci různé úrovně práv a navíc nechceme mít položky napevno zadrátované v kódu. Po prostudování dokumentace jsem zjistil, že to nebude tak jednoduché...
Nakonec jsem řešení nalezl - musí se využít c:forEach funkce, pomocí níž můžeme iterovat:

 <c:foreach items="#{dropDownMenuBean.polozky}" var="polozka">  
   <rich:menuitem submitmode="ajax" value="#{polozka}">  
 </rich:menuitem></c:foreach>  

Má předchozí snaha použít tag a4j:repeat se nesetkala s úspěchem. Jak jsem se později dočetl, je to proto, že dropDownMenu očekává tag menuitem.
Po zadání foreach se mi objevila chyba - c:foreach neznámý tag. Zapomněl jsem totiž do hlavičky vložit definici namespace:
xmlns:c="http://java.sun.com/jstl/core"
Příště sepíšu své zkušenosti se sestavováním vývojového prostředí.

středa 16. února 2011

Java 1.6 a HP-UX

Instalujete javu 1.6 na stroj, který má HP-UX? Nejspíše narazíte, stejně jako já, na následující problém:

$ java -version
/usr/lib/dld.sl: Can't find path for shared library: libjli.sl
/usr/lib/dld.sl: No such file or directory
ARIES32: Core file for PA32 application saved to /home/tcma/core.java
ABORT instruction (core dumped)

Co dál? Řešení je docela jednoduché, spusťte:

$ export SHLIB_PATH=/opt/java6/jre/lib/PA_RISC2.0/jli

Samozřejmě doporučuji si tento řádek přidat do souboru .profile v domovském adresáři, aby se nastavení provedlo při každém startu systému. Jinak byste svým následníkům, až za pár let server otočí, připravili perné chvilky ;)

čtvrtek 30. září 2010

Jak v JAVA s pomocí Eclipse na POSIX signály

Zpracování signálů není bohužel nadále úplně podporováno, tak je potřeba využít těchto deprecated knihoven:

sun.misc.Signal;

sun.misc.SignalHandler;

První slouží k posílání signálů, druhá k jejich handlování. Eclipse ale standardně nedovolí kompilovat kód s deprecated knihovnami, ale to se dá lehce nastavit. Takže prolezte po následující cestě a kontrolu vyjměte:

Preferences → Java → Compiler → Errors/Warnings → Deprecated And Restricted API → Forbidden/Discouraged Reference

No a teď už záleží na Vás, jaké signály začnete řešit, jen pozor, že ve Windows jich není tolik, jako v Unixu, viz tabulka v tomto odkazu: http://www.ibm.com/developerworks/java/library/i-signalhandling